3

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, 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 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!

9
  • The first error you are seeing is caused by this bug in matplotlib. It was fixed in v1.4.0, so you should probably consider updating. Commented Dec 20, 2015 at 19:07
  • Not sure what you mean by "ffmpeg was not available" - did you try sudo apt-get install ffmpeg? Commented Dec 20, 2015 at 19:11
  • Hi, yes I did sudo apt-get install ffmpeg and got Package ffmpeg is not available, but is referred to by another package. This may mean that the package is missing, has been obsoleted, or is only available from another source E: Package 'ffmpeg' has no installation candidate Commented Dec 20, 2015 at 19:19
  • How do I go about updating matplotlib? I tried sudo apt-get update followed by sudo apt-get install python-matplotlib and it said that matplotlib is already the latest version. Commented Dec 20, 2015 at 19:23
  • Updating matplotlib won't solve this particular problem - it will just mean that you get a more informative error message. It seems that ffmpeg was removed from the official repositories in 14.04, but you can install it by adding this unofficial PPA. Commented Dec 20, 2015 at 19:29

2 Answers 2

3

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 which was fixed in version 1.4.0 (also mentioned here).

  • 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).

  • OP was having difficulty installing ffmpeg because it was dropped from the official Ubuntu repositories in version 14.04 (it was reinstated in Ubuntu 15.04). One work-around for those still using older versions of Ubuntu is to add this unofficial PPA:

    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
    
Sign up to request clarification or add additional context in comments.

Comments

0

1) Make sure you using matplotlib V1.4 or higher

python -c 'import matplotlib;print matplotlib.__version__'

2a) Try to install ffmpeg, on 14.04 probably you will fail. if so, go to 2b)

2b) then install libav-tools:

 sudo apt-get install libav-tools

and use this clause to save animation

anim.save('image.mp4', fps=20, writer="avconv", codec="libx264")

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.