使用FuncAnimation在Matplotlib中对轮廓图进行动画处理

时间:2019-05-29 22:00:38

标签: python matplotlib animation contour

我正在尝试使用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()将它们全部绘制在一张图上,但无济于事!

1 个答案:

答案 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')

enter image description here