我试图看到一个系统在相空间中的演化。我有一个对应于每次迭代的矩阵列表(在“results”数组中),并且我正在尝试使用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),我知道一个事实并不对应于系统的最终状态,因为当我在' results‘中的单个矩阵上使用imshow时,我获得了正确的结果-2D模式)。
也许我把所有东西都重叠了,这就是为什么它变成了单一的颜色?我不知道问题到底出在哪里。
发布于 2019-07-22 09:09:55
对于这些类型的任务,我喜欢使用celluloid (免责声明:我是作者)。它不像FuncAnimation那样高效内存,因为它在幕后使用了ArtistAnimation。也就是说,这里有一个示例,说明如何使用它从一系列imshow调用中制作动画。实际上,您只需在每个imshow之后调用camera.snap即可。
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')

https://stackoverflow.com/questions/57100738
复制相似问题