2011-12-15 11 views
6

Nauczyłem się więc tworzyć małe animacje w matplotlib. Na przykład:Animacje Matplotlib - jak wyeksportować je do formatu do użycia w prezentacji?

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

To działa i jest bardzo ładne. Ale w jaki sposób wykorzystam to, by zrobić film, który mogę wyświetlić, na przykład w prezentacji pdf? Próbowałem wykonać fig.savefig("test.gif"), ale jest komunikat o błędzie informujący, że matplotlib nie eksportuje GIF-ów.

Czy można to zrobić bez korzystania z narzędzi zewnętrznych (takich jak wykonywanie wielu png i łączenie ich razem)?

Odpowiedz

8

W skrócie, nie ma innego sposobu niż użycie narzędzia zewnętrznego. W wersji 1.1.0 znajduje się nowy moduł, który pomaga wykonać animations i zapisać go w formacie MPEG4. Używa zewnętrznego narzędzia do automatycznej konwersji, z wielu klatek na pojedynczy film. Możesz zrobić swój gif, używając konwersji imagemagick lub użyć ffmpeg lub mencoder, które są dwiema opcjami dostarczonymi przez nowy moduł animacji.

+1

+1. Jednak prawdopodobnie masz na myśli mencoder zamiast memcoder, prawda? – EOL

+2

Właśnie, więc dodaję 'rys.savefig (" foo% d.png "% i)', aby zapisać każdą klatkę i użyć mencodera? –

+0

Dokładnie. Tak właśnie działa nowy moduł animacji. Jeśli nie chcesz korzystać z modułu, wywołaj mencoder z Pythona, a następnie możesz odłączyć pliki foo * png. – Yann

6

Jeśli używasz matplotlib.animation i mieć coś podobnego FFmpeg na swojej drodze wtedy powinno działać:

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

słodkie, eh?

+0

Rzeczywiście! Czy istnieje sposób na ustawienie liczby klatek na sekundę wyjścia mp4? @danodonovan –

+1

Jeśli zmienisz parametr 'interval' w' ArtistAnimation', to powinien zmienić liczbę klatek na sekundę. Prawdopodobnie istnieje też zmienna 'FFmpeg', ale nie jestem ekspertem' FFmpeg'. – danodonovan

+0

Dzięki! Jest to bardzo pomocne. –

Powiązane problemy