2014-12-29 7 views
2

Учитывая приведенный ниже код, я ожидал бы, что ось x будет находиться между 0 и 3 с добавленными полями. Вместо этого он намного больше. Я ожидал бы, что вызов разбросанет, чтобы автоматически обновить пределы оси x. Я мог бы установить xlim и ylim себе, но хотел бы, чтобы они были установлены автоматически. Что я делаю не так?График рассеяния в matplotlib не обновляется xlim и ylim

import matplotlib.pyplot as plt 

if __name__ == '__main__': 

    fig = plt.figure() 
    ax = fig.add_subplot(111) 

    x = [0, 4000, 8000, 100000] 
    y = [0, 10, 100, 150] 
    ax.scatter(x, y) 

    x = [0, 1, 2, 3] 
    y = x 

    ax.clear() 

    ax.scatter(x, y) 
    plt.show() 

enter image description here

ответ

2

Вы можете очистить фигуру, и открыть новую сюжетные, чем оси будут скорректированы, как вы хотели.

fig = plt.figure() 
ax = fig.add_subplot(111) 

x = [0, 4000, 8000, 100000] 
y = [0, 10, 100, 150] 
ax.scatter(x, y) 

plt.clf() 
ax = fig.add_subplot(111) 

x = [0, 1, 2, 3] 
y = x 

ax.scatter(x, y) 
plt.show() 

Edit: В этой версии фигуры не закрывается, просто очищается с помощью функции КТМ.

+0

Это то, что я в конечном итоге использовал, но кажется, что тратить время на воссоздание фигуры каждый раз, когда нужен новый график рассеяния. – dafeda

0

Если закомментировать первый разброс, все будет хорошо

+1

Несомненно, но почему это не работает с первым разбросом, как есть? Это простой пример, но у меня такая же проблема в более сложном приложении, которое я пишу. – dafeda

2

Это свойство, которое scatter не автоматически переопределяет график, как во многих случаях, что было бы нежелательным. См Axes.autoscale и Axes.relim

ax.relim() # might not be needed 
ax.autoscale() 

должны делать то, что вы хотите.

+1

Я пробовал оба с и без запуска relim() без везения. – dafeda

1

Вот способ сделать еще один график разброса без необходимости очистки фигуры. Я в основном обновляю обивки PathCollection, возвращаемые axes.scatter(), и добавляю коллекцию обратно к осям. Конечно, сначала необходимо очистить оси. Одна вещь, которую я замечаю, это то, что я должен вручную установить поля.

import matplotlib.pyplot as plt 
import numpy as np 

fig = plt.figure() 
ax = fig.add_subplot(111) 

x = [0, 4000, 8000, 100000] 
y = [0, 10, 100, 150] 
scat = ax.scatter(x, y) 

x = [0, 1, 2, 3] 
y = x 

ax.clear() 
corners = (min(x), min(y)), (max(x), max(y)) 
ax.update_datalim(corners) 
ax.margins(0.05, 0.05) 
ax.autoscale_view() 
scat.set_offsets(np.vstack((x,y)).transpose()) 
ax.add_collection(scat) 

plt.show() 
Смежные вопросы