2012-05-27 2 views
3

Я хочу сделать серию сюжетов (предназначенных для создания анимации), и поэтому я хочу повторно использовать оси и сохранить границы x и y на всех графиках, поэтому я установил ax.autoscale(False). Однако, когда я очищаю оси, используя plt.cla(), чтобы нарисовать следующее изображение, настройка автомасштаба переопределяется, поэтому я должен установить ax.autoscale(False), а пределы x и y - на каждой итерации.Сохранять автомасштабирование при очистке осей в matplotlib

In [49]: fig = plt.figure(1) 

In [50]: ax = fig.add_subplot(1, 1, 1) 

In [59]: ax.get_autoscale_on() 
Out[59]: True 

In [60]: ax.autoscale(False) 

In [61]: ax.get_autoscale_on() 
Out[61]: False 

In [62]: plt.cla() 

In [63]: ax.get_autoscale_on() 
Out[63]: True 

, так что я в конечном итоге делает ax.lines = [] или ax.lines.pop(), но это заставляет меня, чтобы установить цвет на каждом участке, чтобы избежать цвета на велосипеде. Если я установил hold в False, тогда настройка автомасштаба сбрасывается каждый раз, когда я звоню ax.plot(). Есть ли другой способ сохранить свойства осей при удалении всех графиков?

+0

Почему бы просто не обновить данные художника, а не делать вызов 'plot' каждый раз? –

+0

Не знаю, как я могу это сделать. Не могли бы вы разместить его в качестве ответа? – astrojuanlu

ответ

4

Не звоните plt.cla(), это будет ясно текущие оси. Если вы хотите создать анимацию, используйте вместо этого matplotlib.pyplot.draw(), который будет redraw текущей фигуры, и я думаю, что это то, что вы хотите.

from pylab import * 
import matplotlib.pyplot as plt 
ion() 
ax=plt.subplot(111) 

line1, = ax.plot(x,y,label='x') 

for i in xrange(20): 
#update your data to new x,y 
line1.set_xdata(x) 
line1.set_ydata(y) 
draw() 

CookBook of Matplotlib имеет некоторые хорошие примеры на анимации, вы можете проверить его.

+0

Спасибо за ответ и ссылку в «Поваренную книгу»! Я собираюсь проверить ваш код и некоторые улучшения производительности, которые предлагаются. – astrojuanlu

+0

Ну, ключ - это трюк 'line.set_data', который делает магию, в которой я нуждаюсь, но ваш пример и те, которые появляются в Поваренной книге, кажутся мне бесполезными, поскольку они обновляют анимацию скоростью цикла' for' - сама страница заявляет, что информация очень устарела, и новый API анимации (http://matplotlib.sourceforge.net/api/animation_api.html) представляется более ценным. На самом деле, если я добавлю вызов 'sleep()' в цикле, то он совсем не обновляется до тех пор, пока я^C. – astrojuanlu

+0

Что делать, если точки на графике движутся? Эти методы работают только при добавлении данных на каждом шаге, но не в том случае, если точки удалены или их необходимо перерисовать в других координатах. – Kevlar

Смежные вопросы