2012-05-03 35 views
8

Tôi có lưới NxN với một số giá trị, thay đổi từng bước thời gian. Tôi đã tìm thấy một cách để vẽ một cấu hình lưới duy nhất của điều này với chức năng matshow, nhưng tôi không biết làm cách nào để cập nhật trạng thái với mọi bước thời gian. Dưới đây là một ví dụ đơn giản:
Animate thay đổi lưới bậc hai (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() 

Mã này tạo ra hình ảnh sau đây: enter image description here
Bây giờ tưởng tượng rằng các bước thời gian tới một số giá trị thay đổi, vì vậy nên bức tranh này. Đây là logic tôi đã lưu ý:

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

Điều này tạo ra 10 ảnh. Tôi muốn tạo hiệu ứng này thay vì tạo ra các bức ảnh riêng lẻ, và ví dụ tôi muốn chọn một bước thời gian giữa các thay đổi (tức là, tốc độ khung hình).
Ngoài ra, tôi mở để gợi ý cho một chức năng khác nhau, nếu matshow không phải là cách để đi, nhưng hãy giữ nó đơn giản, tôi là tương đối thiếu kinh nghiệm.

Trả lời

13

matplotlib 1.1 có một module hoạt hình (nhìn vào examples).

Sử dụng animation.FuncAnimation bạn có thể cập nhật cốt truyện của bạn như vậy:

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

Bạn có thể lưu hình ảnh động sử dụng:

ani.save('animation.mp4') 

tôi giúp bạn tiết kiệm nó với

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

các khung là được bảo tồn và bạn có thể tạo một hình gif động như sau bằng

convert *.png animation.gif 

enter image description here

+0

Cảm ơn bạn, đó là những gì tôi đang tìm kiếm. – enedene

+1

Tôi nên hỏi điều này trong câu hỏi, nhưng có cách nào để đặt điều kiện trên a-b sao cho hoạt ảnh ngừng hoạt động và chỉ còn lại hình cuối cùng (như thể tôi đã vẽ sơ đồ tĩnh). Ví dụ: nếu max (a-b)> 22? – enedene

+1

@bmu Tôi đã tự do thêm một vài khung hình "phim" của bạn dưới dạng hình động gif - câu trả lời tuyệt vời! Nhìn vào hình ảnh động, tôi sẽ gợi ý rằng colorbar có giới hạn cố định nên nó không thay đổi trong suốt quá trình hoạt ảnh. – Hooked

1

Cách dễ nhất là có thể có matplotlib lưu hình ảnh riêng lẻ và sau đó có một chương trình hoặc thư viện khác ghép chúng lại với nhau thành hoạt ảnh. Phương pháp này sử dụng một module gọi là write2gif nhưng bạn cũng có thể sử dụng bộ mã hóa, ffmpeg hoặc bất kỳ phần mềm nào khác có khả năng sản xuất video:

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)  

Dưới đây là một ví dụ về cách để làm điều đó từ bên trong giao diện pylab của. Nó không làm việc rất tốt kể từ khi vẽ liên tục chạy trong cùng một thread như pylabs xử lý 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) 
+0

Cảm ơn bạn đã trả lời của bạn. Có những ví dụ về các ô hoạt hình trong giao diện matplotlib, ví dụ: http://www.scipy.org/Cookbook/Matplotlib/Animations Chẳng có cách nào để ví dụ của tôi được làm động trong giao diện đó? – enedene

Các vấn đề liên quan