我有一个NxN网格,其中包含一些值,每个时间步都会改变。我找到了一种用matshow
函数绘制单个网格配置的方法,但我不知道如何更新每个时间步的状态。这是一个简单的例子:
from pylab import *
from matplotlib import pyplot
a = arange(25)
a = a.reshape(5,5)
b = 10*rand(5,5)
matshow(a-b, cmap = cm.jet)
colorbar()
show()
此代码生成以下图片:
现在想象下一次步骤有些值会改变,所以这张图片也应如此。这是我心中的逻辑:
from pylab import *
from matplotlib import pyplot
a = arange(25)
a = a.reshape(5,5)
time=10
for t in range(time):
b = 10*rand(5,5)
print b
matshow(a-b, cmap=cm.jet)
colorbar()
show()
这会产生10张照片。我想要制作动画而不是制作单独的图片,例如我想选择更改之间的时间步长(即帧速率)。
此外,如果matshow
不是可行的话,我愿意接受不同功能的建议,但请保持简单,我相对缺乏经验。
答案 0 :(得分:13)
matplotlib 1.1有一个动画模块(查看examples)。
使用animation.FuncAnimation
您可以更新您的情节:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def generate_data():
a = np.arange(25).reshape(5, 5)
b = 10 * np.random.rand(5, 5)
return a - b
def update(data):
mat.set_data(data)
return mat
def data_gen():
while True:
yield generate_data()
fig, ax = plt.subplots()
mat = ax.matshow(generate_data())
plt.colorbar(mat)
ani = animation.FuncAnimation(fig, update, data_gen, interval=500,
save_count=50)
plt.show()
您可以使用以下方式保存动画:
ani.save('animation.mp4')
我用
保存ani.save('animation.mp4', clear_temp=False)
这些帧是守恒的,您可以使用
创建如下所示的动画gifconvert *.png animation.gif
答案 1 :(得分:1)
最简单的方法可能是让matplotlib保存单个图像,然后让另一个程序或库将它们拼接成动画。此方法使用名为write2gif的模块,但您也可以使用mencoder,ffmpeg或任何其他能够生成视频的软件:
from images2gif import writeGif
from pylab import *
from matplotlib import pyplot as plt
from PIL import Image
a = arange(25)
a = a.reshape(5,5)
time=10
images = []
for t in range(time):
fig = plt.figure(figsize = (5, 5))
ax = fig.add_subplot(111)
b = 10*rand(5,5)
cax = ax.matshow(a-b, cmap=cm.jet, vmin = -8, vmax = 24)
fname = 'tmp%03d.png' % t
fig.colorbar(cax)
fig.savefig(fname)
images.append(Image.open(fname))
writeGif('matanim.gif', images, duration = .2)
以下是如何在pylab界面中执行此操作的示例。它不能很好地工作,因为连续渲染在与pylabs gui处理程序相同的线程中运行:
from pylab import arange, cm, draw, rand
from matplotlib import pylab as plt
from time import sleep
plt.ion()
a = arange(25)
a = a.reshape(5,5)
fig = plt.figure(figsize = (5, 5))
for i in range(200):
ax = fig.add_subplot(111)
b = 10*rand(5,5)
cax = ax.matshow(a-b, cmap=cm.jet, vmin = -8, vmax = 24)
if i == 0:
fig.colorbar(cax)
draw()
sleep(0.2)