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 に答える