Save Matplotlib Animation

I am trying to animate a wave packet and save it as a movie. Everything except saving works. Could you tell me what I am doing wrong? When entering the line ani.save('MovWave.mp4') it tells me:

  writer = writers.list()[0] IndexError: list index out of range 

I tried it, of course, but I don’t even know what that means.

UPDATE: Now I can call ffmpeg in the console. He says that I have installed ffmpeg version 0.10.7-6:0.10.7-0jon1~precise . I updated the code and ran the program, but now I get the following error:

 Traceback (most recent call last): ani.save('MovWave.mpeg', writer="ffmpeg") writer.grab_frame() dpi=self.dpi) self.canvas.print_figure(*args, **kwargs) self.figure.dpi = origDPI self.dpi_scale_trans.clear().scale(dpi, dpi) self._mtx = np.identity(3) from numpy import eye File "<frozen importlib._bootstrap>", line 1609, in _handle_fromlist UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte 

Update 2: There seems to be an error when using python 3.3 as a pointer for a doctor. Now I am trying to use python 2.7. Now it creates an mpeg file, but it cannot be played, and it has a value of about 150 kb.

Update 3: Good, so I tried the same code on my Win7 machine, and it also works in python 3.3. But I have the same problem as before with python 2.7. The created mpeg file cannot be played and is only a few hundred kB.

 #! coding=utf-8 import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as animation import time time.clock() def FFT(x,y): X = (x[-1]-x[0])/len(y) f = np.linspace(-2*np.pi/X/2,2*np.pi/X/2,len(y)) F = np.fft.fftshift(np.fft.fft(y))/np.sqrt(len(y)) return(f,F) def FUNCTION(k_0,dx,c,t): y = np.exp(1j*k_0*(xc*t))*np.exp(-((xc*t)/(2*dx))**2 )*(2/np.pi/dx**2)**(1/4) k,F = FFT((xc*t),y) return(x,y,k,F) #Parameter N = 1000 x = np.linspace(0,30,N) k_0 = 5 dx = 1 c = 1 l = [k_0,c,dx] fig = plt.figure("Moving Wavepackage and it FFT") sub1 = plt.subplot(211) sub2 = plt.subplot(212) sub2.set_xlim([-10,10]) sub1.set_title("Moving Wavepackage and it FFT") sub1.set_ylabel("$Re[\psi(x,t)]$") sub1.set_xlabel("$t$") sub2.set_ylabel("$Re[\psi(k_x,t)]$") sub2.set_xlabel("$k_x$") n = 50 t = np.linspace(0,30,n) img = [] for i in range(n): x,y,k,F = FUNCTION(k_0,dx,c,t[i]) img.append(plt.plot(x,np.real(y),color="red", axes=plt.subplot(211))) img.append(plt.plot(k,np.real(F),color="red", axes=plt.subplot(212))) ani = animation.ArtistAnimation(fig, img, interval=20, blit=True, repeat_delay=0) ani.save('MovWave.mpeg', writer="ffmpeg") print(time.clock()) plt.show() 
+8
python matplotlib animation
source share
2 answers

Do you have ffmpeg or mencoder ? See this answer for help installing ffmpeg.

+10
source share

You mentioned mencoder in your text, but not in your code.

Matplotlib docs have a check for mencoder in demo :

 not_found_msg = """ The mencoder command was not found; mencoder is used by this script to make an avi file from a set of pngs. It is typically not installed by default on linux distros because of legal restrictions, but it is widely available. """ try: subprocess.check_call(['mencoder']) except subprocess.CalledProcessError: print "mencoder command was found" pass # mencoder is found, but returns non-zero exit as expected # This is a quick and dirty check; it leaves some spurious output # for the user to puzzle over. except OSError: print not_found_msg sys.exit("quitting\n") 
+2
source share

All Articles