Saving a matplotlib animation in Linux
Question: I'm having a problem saving a matplotlib animation. When I execute the
following test script:

    
    
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib.animation as animation
    
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.set_ylim([0,11])
    ax.set_xlim([0,100])
    
    u, v, ims = [], [], []
    u.append(0)
    v.append(10)
    for i in range(100):
        u.append(i+1)
        v.append(10)
        ims.append(ax.plot(u, v, 'b-', linewidth=3.))
    
    im_ani = animation.ArtistAnimation(fig, ims, interval=50, repeat_delay=3000,
        blit=True) 
    
    im_ani.save('c.mp4')   
    

I get the following error:

    
    
    im_ani.save('c.mp4')   
      File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 712, in save
        with writer.saving(self._fig, filename, dpi):
    AttributeError: 'str' object has no attribute 'saving'
    

Now according to this
[answer](http://stackoverflow.com/questions/24815717/trouble-saving-
matplotlib-animation), I need to install either ffmpeg or libav-tools. I tried
this and found ffmpeg was not available, however libav-tools did seem to
install properly. However, when I executed my script again, I still got the
same error as before.

I also (following the advice of
[this](http://stackoverflow.com/questions/23856990/cant-save-matplotlib-
animation) answer) tried doing

    
    
    mywriter = animation.FFMpegWriter()
    anim.save('mymovie.mp4',writer=mywriter)
    

but that didn't work either! It resulted in the following error:

    
    
      File "anitest.py", line 22, in <module>
        im_ani.save('mymovie.mp4',writer=mywriter)    
      File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 712, in save
        with writer.saving(self._fig, filename, dpi):
      File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__
        return self.gen.next()
      File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 169, in saving
        self.setup(*args)
      File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 159, in setup
        self._run()
      File "/usr/lib/pymodules/python2.7/matplotlib/animation.py", line 186, in _run
        stdin=subprocess.PIPE)
      File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
        errread, errwrite)
      File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
        raise child_exception
    OSError: [Errno 2] No such file or directory
    

Any help here would be much appreciated. I'm using Ubuntu 14.04. Thanks!


Answer: We arrived at a solution in the comments above. To summarise:

  * The reason for that rather cryptic error message:
    
        AttributeError: 'str' object has no attribute 'saving'
    

is [this bug in
matplotlib](https://github.com/matplotlib/matplotlib/issues/2651) which was
fixed in version 1.4.0 ([also mentioned
here](http://stackoverflow.com/q/20137792/1461210)).

  * However, updating matplotlib to 1.4.0 or newer will _not_ address the root cause of the problem, which is simply that `ffmpeg` is not installed ([see here](http://stackoverflow.com/q/24815717/1461210)).

  * OP was having difficulty installing `ffmpeg` because it was [dropped from the official Ubuntu repositories in version 14.04](http://askubuntu.com/a/432585/185188) (it was reinstated in Ubuntu 15.04). One work-around for those still using older versions of Ubuntu is to add [this unofficial PPA](https://launchpad.net/~mc3man/+archive/ubuntu/trusty-media):
    
        $ sudo add-apt-repository ppa:mc3man/trusty-media
    $ sudo apt-get update
    $ sudo apt-get dist-upgrade   # recommended on first use
    $ sudo apt-get install ffmpeg
    

