2011-12-15 33 views
6

Vì vậy, tôi đã học được cách tạo ra những hình động nhỏ dễ thương trong matplotlib. Ví dụ: điều này:Hoạt ảnh Matplotlib - cách xuất chúng sang định dạng để sử dụng trong bản trình bày?

import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 

plt.ion() 

fig = plt.figure() 
ax = fig.add_subplot(111) 

ax.set_xlim(0, 1) 
ax.set_ylim(-2,2) 

dt = 0.01 
q = 0.01 
t = np.arange(0,1,dt) 
x = np.sin(2*np.pi*t) 
line, = ax.plot(t,x, '-') 
fig.canvas.draw() 
for i in xrange(100): 
    x = (1-q) * x + q* np.random.normal(size = len(t)) 
    line.set_ydata(x) 
    fig.canvas.draw() 

Làm việc này và nó rất đẹp. Nhưng làm thế nào tôi sử dụng điều này để làm một bộ phim tôi có thể hiển thị, ví dụ, trong một bài thuyết trình pdf? Tôi đã cố gắng để làm fig.savefig("test.gif") nhưng có một thông báo lỗi chỉ ra rằng matplotlib không xuất gif.

Có cách nào để làm điều này mà không cần sử dụng các công cụ bên ngoài (như tạo nhiều png và ghép chúng lại với nhau) không?

Trả lời

8

Tóm lại, không có cách nào khác ngoài việc sử dụng công cụ bên ngoài. Có một mô-đun mới trong 1.1.0 giúp bạn thực hiện animations và lưu chúng sang định dạng mpeg4. Nó sử dụng một công cụ bên ngoài để tự động thực hiện chuyển đổi này, từ nhiều khung hình thành một phim. Bạn có thể tạo gif của mình bằng cách sử dụng chuyển đổi hoặc sử dụng imagemagick hoặc sử dụng ffmpeg hoặc mencoder, đây là hai tùy chọn được cung cấp bởi mô-đun hoạt ảnh mới.

+1

+1. Tuy nhiên, bạn có thể có nghĩa là mencoder thay vì memcoder, phải không? – EOL

+2

Phải, vì vậy tôi chỉ cần thêm một 'fig.savefig (" foo% d.png "% i)' để lưu từng khung hình và sử dụng bộ mã hóa? –

+0

Chính xác. Đây là những gì các mô-đun hoạt hình mới nào. Nếu bạn không muốn sử dụng mô-đun, hãy gọi mencoder từ python và sau đó bạn có thể hủy liên kết các tệp foo * png sau đó. – Yann

6

Nếu bạn sử dụng matplotlib.animation và có cái gì đó như FFmpeg trong đường dẫn của bạn thì đây nên làm việc:

import numpy as np 
import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib.animation import ArtistAnimation 

fig = plt.figure() 
ax = fig.add_subplot(111) 

ax.set_xlim(0, 1) 
ax.set_ylim(-2,2) 

dt = 0.01 
q = 0.01 
t = np.arange(0,1,dt) 
x = np.sin(2*np.pi*t) 
images = [] 

for i in xrange(100): 
    x = (1-q) * x + q* np.random.normal(size = len(t)) 
    line, = ax.plot(t,x, '-') 
    images.append((line,)) 

line_anim = ArtistAnimation(fig, images, interval=50, blit=True) 
line_anim.save('my_animation.mp4') 
plt.show() 

dễ thương, eh?

+0

Thật vậy! Có cách nào để thiết lập tốc độ khung hình của mp4 đầu ra? @danodonovan –

+1

Nếu bạn thay đổi tham số 'interval' trong' ArtistAnimation', nó sẽ thay đổi tốc độ khung hình. Có lẽ có một biến 'FFmpeg', nhưng tôi không phải là chuyên gia' FFmpeg'. – danodonovan

+0

Xin cảm ơn! Điều này khá hữu ích. –

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