首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从使用imshow显示的矩阵列表中生成gif/mp4文件?

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

Stack Overflow用户
提问于 2019-07-19 02:34:46
回答 1查看 410关注 0票数 0

我试图看到一个系统在相空间中的演化。我有一个对应于每次迭代的矩阵列表(在“results”数组中),并且我正在尝试使用matplotlib来制作gif或mp4文件的动画。

为了简洁起见,我省略了导致结果中矩阵的代码,但我相信我包含了关于问题本身的所有内容。

代码语言:javascript
复制
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),我知道一个事实并不对应于系统的最终状态,因为当我在' results‘中的单个矩阵上使用imshow时,我获得了正确的结果-2D模式)。

也许我把所有东西都重叠了,这就是为什么它变成了单一的颜色?我不知道问题到底出在哪里。

EN

回答 1

Stack Overflow用户

发布于 2019-07-22 09:09:55

对于这些类型的任务,我喜欢使用celluloid (免责声明:我是作者)。它不像FuncAnimation那样高效内存,因为它在幕后使用了ArtistAnimation。也就是说,这里有一个示例,说明如何使用它从一系列imshow调用中制作动画。实际上,您只需在每个imshow之后调用camera.snap即可。

代码语言:javascript
复制
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')

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57100738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档