有几种方法可以为 matplotlib 绘图设置动画。在下面,让我们看两个使用散点图的最小示例。
(a) 使用交互模式plt.ion()
为了让动画发生,我们需要一个事件循环。获取事件循环的一种方法是使用plt.ion()(“interactive on”)。然后需要先绘制图形,然后可以循环更新绘图。在循环内部,我们需要绘制画布并为窗口引入一点暂停以处理其他事件(如鼠标交互等)。如果没有这个暂停,窗口就会冻结。最后我们调用plt.waitforbuttonpress() 让窗口即使在动画完成后也保持打开状态。
import matplotlib.pyplot as plt
import numpy as np
plt.ion()
fig, ax = plt.subplots()
x, y = [],[]
sc = ax.scatter(x,y)
plt.xlim(0,10)
plt.ylim(0,10)
plt.draw()
for i in range(1000):
x.append(np.random.rand(1)*10)
y.append(np.random.rand(1)*10)
sc.set_offsets(np.c_[x,y])
fig.canvas.draw_idle()
plt.pause(0.1)
plt.waitforbuttonpress()
(b) 使用FuncAnimation
以上大部分内容都可以使用matplotlib.animation.FuncAnimation 自动完成。 FuncAnimation 将负责循环和重绘,并在给定时间间隔后不断调用函数(在本例中为 animate())。动画只会在调用plt.show() 时开始,从而自动在绘图窗口的事件循环中运行。
import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np
fig, ax = plt.subplots()
x, y = [],[]
sc = ax.scatter(x,y)
plt.xlim(0,10)
plt.ylim(0,10)
def animate(i):
x.append(np.random.rand(1)*10)
y.append(np.random.rand(1)*10)
sc.set_offsets(np.c_[x,y])
ani = matplotlib.animation.FuncAnimation(fig, animate,
frames=2, interval=100, repeat=True)
plt.show()