我想使用MatPlotLib绘制一个图,图随时间变化。在每个时间步长,一个额外的数据点将被添加到图中。但是,应该只显示一个图,其外观随时间变化。
在我的测试示例中,图是一个简单的线性图(y = x)。下面是我尝试的:
for i in range(100):
x = range(i)
y = range(i)
plt.plot(x, y)
plt.ion()
plt.show()
time.sleep(1)
然而,这里发生的是创建了多个窗口,因此在循环结束时我有100个窗口。另外,我注意到,对于最近的窗口,它只是一个白色窗口,并且绘图只出现在下一步。
所以我的两个问题是
1)如何更改代码,使其只显示一个窗口,而该窗口的内容会随时间而变化?
2)如何更改代码,以便在最近的时间步长中,图实际上显示在窗口上,而不是只显示一个白色窗口?
谢谢!
3条答案
按热度按时间s6fujrry1#
(1)
您可以在开始时设置
plt.ion()
,并将所有图形绘制到同一个窗口。在循环中,使用plt.draw()
显示图形,使用plt.pause(t)
暂停。请注意,t
可以非常小,但需要有命令才能使动画在大多数后端上工作。在使用
plt.gca().cla()
打印新内容之前,可能需要清除轴。除了这种非常简单的方法之外,还可以使用http://matplotlib.org/examples/animation/index.html中提供的任何动画示例
(二)
为了在新窗口中获取每个图,使用
plt.figure()
并删除plt.ion()
。也只显示最后的窗口:注意,你可能会发现在这两种情况下,第一个图都是空的,因为对于
i=0
,range(i) == []
是一个没有任何点的空列表。即使对于i=1
,也只有一个点被绘制出来,但是当然没有任何线可以连接一个点。xdyibdwo2#
我认为最好的方法是创建一个线图,然后更新其中的数据。这样你就有了一个窗口和一个图表,它会不断更新。
hsvhsicv3#
这里有一个方法,我发现工作真的很好。
你需要这个包裹
clear_output
清除notebook的输出。这将获取一个点列表,清除单元格的输出并绘制一个新的图形。
你可以把它放在一个
for
循环中,看起来像这样:应该是这样的。
我并不是说这就是方法,但它足够简单,我可以理解和编辑,并为我完成工作。
编辑我添加了
plt.legend()
来显示图的名称,它没有显示在gif中,因为那是在我创建gif之后。