【问题标题】:Animate quadratic grid changes (matshow)动画二次网格变化(matshow)
【发布时间】:2012-05-03 10:30:42
【问题描述】:

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

【问题讨论】:

    标签: python numpy matplotlib


    【解决方案1】:

    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)
    

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

    convert *.png animation.gif
    

    【讨论】:

    • 谢谢,这正是我要找的。​​span>
    • 我应该在问题中问这个问题,但是有没有办法在 a-b 上设置一个条件,以便动画停止,并且只保留最后一个数字(就像我做了静态图一样)。例如如果 max(a-b)>22?
    • @bmu 我冒昧地将您的“电影”的几帧添加为动画 gif - 很好的答案!看看动画,我建议颜色条有固定的限制,所以它在动画期间不会改变。
    • @Hooked:我试图上传一个动画 gif,但是出了点问题,所以我认为 Stackoverflow 不允许。但它有效,很好。
    • @enedene:如果满足条件,您可以使用time.sleep() 将动画停止一段时间。但是,我认为如果他想继续,与用户互动会很困难。
    【解决方案2】:

    最简单的方法可能是让 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)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    相关资源
    最近更新 更多