2012-05-03 11 views
8

Mam siatkę NxN z pewnymi wartościami, które zmieniają się za każdym razem. Znalazłem sposób na wykreślenie pojedynczej konfiguracji siatki z funkcją matshow, ale nie wiem jak zaktualizować status za każdym razem. Oto prosty przykład:
Animacja zmian siatki kwadratowej (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() 

Ten kod daje następujący obraz: enter image description here
Teraz wyobraź sobie, że następnym krokiem czas niektóre wartości zmienić, dlatego należy ten obraz. Taką logikę miałem na myśli:

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() 

Powoduje to utworzenie 10 zdjęć. Chciałbym animować to, zamiast tworzyć pojedyncze obrazy, i na przykład chciałbym wybrać krok czasowy pomiędzy zmianami (czyli liczbą klatek na sekundę).
Ponadto, jestem otwarty na sugestie dotyczące różnych funkcji, jeśli nie jest to droga, którą można wykonać, ale proszę, proszę bardzo, jestem stosunkowo niedoświadczony.

Odpowiedz

13

matplotlib 1.1 ma moduł animacji (patrz na examples).

Korzystanie animation.FuncAnimation można zaktualizować swoją działkę tak:

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() 

Można zapisać animację używając:

ani.save('animation.mp4') 

ja go zapisać z

ani.save('animation.mp4', clear_temp=False) 

ramki są Zachowaj i możesz stworzyć animowany GIF jak poniżej z

convert *.png animation.gif 

enter image description here

+0

Dziękuję, tego właśnie szukałem. – enedene

+1

Powinienem był zapytać o to w pytaniu, ale czy istnieje sposób na umieszczenie warunku na a-b, aby animacja została zatrzymana i pozostała tylko ostatnia figura (tak jakbym robiła statyczne spisek). Na przykład, jeśli max (a-b)> 22? – enedene

+1

@bmu Wziąłem sobie możliwość dodania kilku klatek twojego "filmu" jako animowanego gif - świetna odpowiedź! Patrząc na animację, sugerowałbym, że pasek koloru ma ustalone limity, więc nie zmienia się podczas animacji. – Hooked

1

Najprostszym sposobem jest prawdopodobnie zapisanie pojedynczych obrazów w matplotlib, a następnie dodanie kolejnego programu lub biblioteki do animacji. Podejście to wykorzystuje moduł o nazwie write2gif ale można również użyć MEncoderem ffmpeg lub inne oprogramowanie zdolne do wytwarzania filmu:

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)  

Oto przykład, w jaki sposób to zrobić z poziomu interfejsu użytkownika pylab. Nie działa tak dobrze, ponieważ ciągłe renderowania działa w taki sam gwint jak pylabs gui obsługi:

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) 
+0

Dziękuję za odpowiedź. Istnieją przykłady animacji wątków w interfejsie matplotlib, na przykład: http://www.scipy.org/Cookbook/Matplotlib/Animations Czy mój interfejs nie może być animowany również w tym interfejsie? – enedene