11

我有一个带有一些值的 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不是要走的路,但请保持简单,我相对缺乏经验。

4

2 回答 2

18

matplotlib 1.1 有一个动画模块(查看示例)。

使用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)

帧被保留,您可以创建一个如下所示的动画 gif

convert *.png animation.gif

在此处输入图像描述

于 2012-05-03T12:17:44.797 回答
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)
于 2012-05-03T11:24:26.337 回答