Reputation: 14022
So, I learned how to make cute little animations in matplotlib. For example, this:
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()
This works and it's very nice. But how I use this to make a movie I can display, for example, in a pdf presentation? I tried to do fig.savefig("test.gif")
but there's an error message indicating that matplotlib doesn't export gifs.
Is there a way of doing this without resorting to external tools (like making a lot of png's and stitching them together)?
Upvotes: 6
Views: 12419
Reputation: 20373
If you use matplotlib.animation
and have something like FFmpeg
in your path then this should work:
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()
cute, eh?
Upvotes: 6
Reputation: 35543
In short, no there is no other way besides using an external tool. There is a new module in 1.1.0 that helps you do animations and save them to mpeg4 format. It uses an external tool to automatically do this conversion, from many frames to a single movie. You can make your gif using imagemagick's convert or use ffmpeg or mencoder, which are the two options provided by the new animation module.
Upvotes: 8