Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

matplotlib save animation in gif error

I want to save matplotlib animation in gif format.

I succeded to save animation to mp4 format, using code

import matplotlib
matplotlib.use("Agg")

~some codes~

ani = animation.FuncAnimation(fig, draw, update, interval=10, blit=False)
mywriter = animation.FFMpegWriter(fps=60)
ani.save('myanimation.mp4',writer=mywriter)

but if I change myanimation.mp4 to gif format, python makes error

Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\edison\Edison_v4_backup_1\ver5.py", line 164, in <module>
    ani.save('demoanimation.gif',writer=mywriter);
  File "C:\Python27\lib\site-packages\matplotlib\animation.py", line 718, in save
    writer.grab_frame(**savefig_kwargs)
  File "C:\Python27\lib\site-packages\matplotlib\animation.py", line 204, in grab_frame
    dpi=self.dpi, **savefig_kwargs)
  File "C:\Python27\lib\site-packages\matplotlib\figure.py", line 1421, in savefig
    self.canvas.print_figure(*args, **kwargs)
  File "C:\Python27\lib\site-packages\matplotlib\backend_bases.py", line 2220, in print_figure
    **kwargs)
  File "C:\Python27\lib\site-packages\matplotlib\backends\backend_agg.py", line 497, in print_raw
    renderer._renderer.write_rgba(filename_or_obj)
RuntimeError: Error writing to file

Seeing that I succeded to save in mp4 format, I don't know why it makes error when saving gif format.

like image 827
user42298 Avatar asked Aug 05 '14 14:08

user42298


People also ask

How do I save an animation in Matplotlib?

To save an animation, we can use Animation. save() or Animation.

How do I save an animation as a mp4 in Python?

To save this animation as an mp4 you can simply call ani. save() . If you just want to take a look at it before you save it call plt. show() instead.

What is PillowWriter?

The PillowWriter class from matplotlib. animation is a writer that allows us to save animations we create in matplotlib . Pillow is a fork of the Python Image Library (PIL). Both PIL and Pillow come with matplotlib .

How do I show an animation in Matplotlib?

Animations in Matplotlib can be made by using the Animation class in two ways: By calling a function over and over: It uses a predefined function which when ran again and again creates an animation. By using fixed objects: Some animated artistic objects when combined with others yield an animation scene.


2 Answers

This is because matplotlib does not support GIFs without external programs. If you have imagemagick correctly installed and configured, this should work:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import matplotlib.animation
import numpy as np


def init_animation():
    global line
    line, = ax.plot(x, np.zeros_like(x))
    ax.set_xlim(0, 2*np.pi)
    ax.set_ylim(-1,1)

def animate(i):
    line.set_ydata(np.sin(2*np.pi*i / 50)*np.sin(x))
    return line,

fig = plt.figure()
ax = fig.add_subplot(111)
x = np.linspace(0, 2*np.pi, 200)

ani = matplotlib.animation.FuncAnimation(fig, animate, init_func=init_animation, frames=50)
ani.save('/tmp/animation.gif', writer='imagemagick', fps=30)

enter image description here

like image 136
DrV Avatar answered Jan 11 '23 01:01

DrV


Just a reminder, before you use Matplotlib and ImageMagick to convert images or videos to gif, you need to modify Matplotlib's config and add ImageMagick's path.

The following code will show you the config file path of Matplotlib

import matplotlib
matplotlib.matplotlib_fname()

For me the path is

C:\Anaconda\lib\site-packages\matplotlib\mpl-data\matplotlibrc

Then changing animation.convert_path

#animation.convert_path: 'convert' # Path to ImageMagick's convert binary.
                                   # On Windows use the full path since convert
                                   # is also the name of a system tool.

by adding convert.exe path to it

animation.convert_path: C:\Program Files\ImageMagick-6.9.2-Q16-HDRI\convert.exe

Don't forget to remove the # before animation.convert_path.

After the above modification, Matplotlib and ImageMagick will perfectly work and output the gif file you want.

example gif

Hope it helps.

like image 41
eric Avatar answered Jan 10 '23 23:01

eric