我想使用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)如何更改我的代码,以便在最近的时间步骤中,绘图实际显示在窗口上,而不是仅显示白色窗口?
谢谢!
答案 0 :(得分:2)
您可以在开头设置plt.ion()
并将所有图形绘制到同一窗口。在循环中,使用plt.draw()
显示图表,plt.pause(t)
暂停。请注意t
可能非常小,但命令需要在那里才能使动画适用于大多数后端。
您可能希望在使用plt.gca().cla()
绘制新内容之前清除轴。
import matplotlib.pyplot as plt
plt.ion()
for i in range(100):
x = range(i)
y = range(i)
# plt.gca().cla() # optionally clear axes
plt.plot(x, y)
plt.title(str(i))
plt.draw()
plt.pause(0.1)
plt.show(block=True) # block=True lets the window stay open at the end of the animation.
除了这个非常简单的方法之外,请使用http://matplotlib.org/examples/animation/index.html
中提供的任何动画示例要在新窗口中显示每个图表,请使用plt.figure()
并删除plt.ion()
。也只在最后显示窗口:
import matplotlib.pyplot as plt
for i in range(100):
x = range(i)
y = range(i)
plt.figure()
plt.plot(x, y)
plt.title(str(i))
plt.show()
请注意,在两种情况下,您可能会发现第一个图是空的,因为对于i=0
,range(i) == []
是一个没有任何点的空列表。即使对于i=1
,也只绘制了一个点,但当然没有线可以将单个点连接到自身。
答案 1 :(得分:0)
我认为最好的方法是创建一个折线图,然后更新其中的数据。然后,您将拥有单个窗口和单个图形,这些图形将不断更新。
import matplotlib.pyplot as plt
plt.ion()
fig = plt.figure(figsize=(16,8))
axes = fig.add_subplot(111)
data_plot=plt.plot(0,0)
line, = axes.plot([],[])
for i in range(100):
x = range(i)
y = range(i)
line.set_ydata(y)
line.set_xdata(x)
if len(y)>0:
axes.set_ylim(min(y),max(y)+1) # +1 to avoid singular transformation warning
axes.set_xlim(min(x),max(x)+1)
plt.title(str(i))
plt.draw()
plt.pause(0.1)
plt.show(block=True)