清除 matplotlib 中的轴时保留自动缩放功能。

6

我想制作一系列图表(用于创建动画),因此我希望重复使用坐标轴并在所有图表中保留x和y限制,所以我设置了 ax.autoscale(False)。然而,当我使用 plt.cla() 清除轴以绘制下一张图片时,自动缩放设置会被覆盖,因此我必须在每次迭代中设置 ax.autoscale(False) 和 x、y限制。

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()时都会重置自动缩放设置。有没有其他方法可以在删除所有图的同时保留轴属性?


为什么不直接更新艺术家的数据,而不是每次调用“plot”? - Joe Kington
我不知道怎么做,你能把它作为答案发出来吗? - astrojuanlu
1个回答

4

不要调用 plt.cla(),它会清空当前的坐标轴。如果你想要创建动画,可以使用 matplotlib.pyplot.draw() 代替,它会重绘当前的图形,我认为这是你想要的。

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()

Matplotlib菜谱有一些很好的动画示例,你可能想要查看它。


谢谢你的回答和食谱链接!我将会检查你的代码以及一些性能改进建议。 - astrojuanlu
好的,关键在于 line.set_data 技巧,它完成了我所需要的魔法,但是你的示例和 Cookbook 中出现的示例似乎对我毫无用处,因为它们使用 for 循环的速度来更新动画 - 该页面本身说明信息已经非常过时,而新的动画 API (http://matplotlib.sourceforge.net/api/animation_api.html) 似乎更有价值。实际上,如果我在循环中添加一个 sleep() 调用,奇怪的是直到我 ^C 循环才会更新。 - astrojuanlu
如果图表上的点在移动怎么办?这种方法只适用于每一步添加数据,而不适用于删除点或需要在其他坐标重新绘制点的情况。 - Kevlar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接