我正在尝试使用MatPlotLib FuncAnimation和轮廓图制作一个简单的动画。到目前为止,这是我正在尝试的方法:
# Create Figure and Axes
figure, ax = plot.subplots()
# Draw new contour with new data from u
def animate(i):
a = u[:, :, int(i)]
CS = ax.contourf(x.flatten(), y.flatten(), a, colors=['blue', 'white'], levels=0)
return CS,
# create animation using the animate() function
myAnimation = FuncAnimation(figure, animate, frames=np.arange(0.0, t, t), interval=10, blit=True)
figure.show()
u [:,:,i]包含要绘制在轮廓中的新Z数据。
这适用于第一帧,但随后我立即从行AttributeError: 'QuadContourSet' object has no attribute 'get_zorder'
中得到错误:CS = ax.contourf(...)
,此后每次迭代。我确实有一个粗略的动画工作,如下所示:
figure, ax = plot.subplots()
for i in range(0, t):
a = u[:, :, i]
CS = ax.contourf(x.flatten(), y.flatten(), a, colors=['blue', 'white'], levels=0)
figure.show()
sleep(0.01)
但是此实现为每个步骤创建了一个新图形,因此效率不高,这就是为什么我要研究FuncAnimation的原因。如果有人知道为什么我的FuncAnimation无法正常工作,或者是否有另一种方法可以将我的所有数据动画化在一张图表上,我将不胜感激!我也尝试过使用clf(),pause()和draw()将它们全部绘制在一张图上,但无济于事!
答案 0 :(得分:0)
另一个选择是使用ArtistAnimation。您可以使用celluloid(免责声明:我已经写过)来轻松捕获图,然后对其进行动画处理。它在后台使用ArtistAnimation。基本思想是,每次在动画中需要图像时就捕获图形。然后,当您要求赛璐oid制作动画时,它就可以处理其余的动画。
请记住,虽然此方法的代码行可能更少,但根据动画的长度,运行时间可能会更长。与FuncAnimation不同,它必须将所有这些图保留在内存中。
import matplotlib.pyplot as plt
import numpy as np
from celluloid import Camera
X, Y = np.meshgrid(np.linspace(0, 10, 100), np.linspace(0, 10, 100))
fig, ax = plt.subplots()
camera = Camera(fig)
for i in np.linspace(0, 2 * np.pi, 30, endpoint=False):
ax.contourf(np.sin(X + i) + np.sin(Y - i))
camera.snap()
anim = camera.animate()
anim.save('contours.mp4')