2011-12-15 4 views
6

Così, ho imparato a creare animazioni carine in Matplotlib. Ad esempio, questo:Animazioni Matlotlib: come esportarli in un formato da utilizzare in una presentazione?

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

Questo funziona ed è molto bello. Ma come lo uso per realizzare un film che posso visualizzare, ad esempio, in una presentazione in formato PDF? Ho provato a fare fig.savefig("test.gif") ma c'è un messaggio di errore che indica che matplotlib non esporta gif.

C'è un modo per farlo senza ricorrere a strumenti esterni (come fare un sacco di png e cucirli insieme)?

risposta

8

In breve, non c'è altro modo oltre all'utilizzo di uno strumento esterno. C'è un nuovo modulo in 1.1.0 che ti aiuta a fare animations e salvarli in formato mpeg4. Usa uno strumento esterno per fare automaticamente questa conversione, da molti frame a un singolo film. Puoi creare la tua gif usando la conversione imagemagick o usa ffmpeg o mencoder, che sono le due opzioni fornite dal nuovo modulo di animazione.

+1

+1. Tuttavia, probabilmente stai pensando a mencoder invece di memcoder, giusto? – EOL

+2

Esatto, quindi aggiungo semplicemente 'fig.savefig (" foo% d.png "% i)' per salvare ogni frame e usare mencoder? –

+0

Esattamente. Questo è ciò che fa il nuovo modulo di animazione. Se non vuoi usare il modulo, chiama mencoder da python e poi puoi scollegare i file foo * png in seguito. – Yann

6

Se si utilizza matplotlib.animation e avere qualcosa di simile FFmpeg nel tuo percorso allora questo dovrebbe funzionare:

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

carino, eh?

+0

Davvero! C'è un modo per impostare il framerate dell'output mp4? @danodonovan –

+1

Se cambi il parametro 'interval' in' ArtistAnimation' dovrebbe cambiare il framerate. Probabilmente c'è anche una variabile 'FFmpeg', ma non sono un esperto di' FFmpeg'. – danodonovan

+0

Grazie! Questo è abbastanza utile. –

Problemi correlati