我试图查看系统在相空间中的演化。我有一个与每次迭代相对应的矩阵列表(在数组“结果”内部),我正在尝试使用matplotlib为gif或mp4文件设置动画。
为了简洁起见,我省略了导致结果内部矩阵的代码,但是我相信我包括了有关问题本身的所有内容。
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
a = results[0]
def init():
global im
im = plt.imshow(a, cmap=plt.cm.copper,
interpolation='sinc',
extent=[-1, 1, -1, 1])
im.set_data(a)
return [im]
def animate(i):
data = results[i]
im.set_array(data)
return [im]
fig = plt.figure()
ax = plt.axes()
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=N, interval=0.1, blit=True)
anim.save('test2.gif', writer='pillow')
plt.show()
当前我的确产生输出,但这是一个gif,图像仅填充了一种颜色(https://i.imgur.com/yXRxpLr.gif),据我所知,事实上这并不对应于最终状态系统,因为当我根据“结果”在单个矩阵上使用imshow时,可以获得正确的结果-2D模式。
也许我重叠了所有内容,这就是为什么它变成单一颜色的原因?我不知道问题出在哪里。
答案 0 :(得分:0)
对于这些类型的任务,我喜欢使用celluloid(免责声明:我是作者)。它不像FuncAnimation那样高效存储,因为它在后台使用ArtistAnimation。话虽如此,这是一个示例,说明如何使用它通过一系列的imshow调用制作动画。您基本上只需在每个camera.snap
之后拨打imshow
。
import matplotlib.pyplot as plt
from celluloid import Camera
import numpy as np
from numpy import random as rng
X = np.zeros((100, 100)) + 0.5
fig = plt.figure()
camera = Camera(fig)
for i in range(20):
plt.imshow(X, interpolation='none', vmin=0, vmax=1)
camera.snap()
X += 0.5 * (rng.rand(100, 100) - 0.5)
X = np.clip(X, 0, 1)
anim = camera.animate()
anim.save('im.mp4')