如何使用imshow从显示的矩阵列表中生成gif / mp4文件?

时间:2019-07-18 18:34:46

标签: python matplotlib animation

我试图查看系统在相空间中的演化。我有一个与每次迭代相对应的矩阵列表(在数组“结果”内部),我正在尝试使用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模式。

也许我重叠了所有内容,这就是为什么它变成单一颜色的原因?我不知道问题出在哪里。

1 个答案:

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

enter image description here