Reputation: 33
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!
Upvotes: 3
Views: 3052
Reputation: 74262
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
Upvotes: 3
Reputation: 29
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")
Upvotes: 0