我一直试图在我的Windows计算机上导出动画gif几天。
以下是基本代码:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
fig, ax = plt.subplots()
xdata, ydata = [], []
ln, = plt.plot([], [], 'ro', animated=True)
def init():
ax.set_xlim(0, 2*np.pi)
ax.set_ylim(-1, 1)
return ln,
def update(frame):
xdata.append(frame)
ydata.append(np.sin(frame))
ln.set_data(xdata, ydata)
return ln,
ani = FuncAnimation(fig, update, frames=np.linspace(0, 2*np.pi, 128),
init_func=init, blit=True)
ani.save("test.gif")
plt.show()
错误:
>>> python .\anim_test.py
Traceback (most recent call last):
File ".\anim_test.py", line 22, in <module>
ani.save("test.gif")
File "C:\Users\ishma\Anaconda2\lib\site-packages\matplotlib\animation.py", line 1063, in save
writer.grab_frame(**savefig_kwargs)
File "C:\Users\ishma\Anaconda2\lib\site-packages\matplotlib\animation.py", line 336, in grab_frame
'with --verbose-debug.'.format(e, out, err))
IOError: Error saving animation to file (cause: [Errno 22] Invalid argument) Stdout: StdError: . It may help to re-run
with --verbose-debug.
PS C:\Users\ishma\Dropbox (SteinLab)\spectra\MassSpecPlot> python .\anim_test.py --verbose-debug
$HOME=C:\Users\ishma
matplotlib data path C:\Users\ishma\Anaconda2\lib\site-packages\matplotlib\mpl-data
*****************************************************************
You have the following UNSUPPORTED LaTeX preamble customizations:
Please do not ask for support with these customizations active.
*****************************************************************
loaded rc file C:\Users\ishma\Anaconda2\lib\site-packages\matplotlib\mpl-data\matplotlibrc
matplotlib version 2.0.2
verbose.level debug
interactive is False
platform is win32
loaded modules: <dictionary-keyiterator object at 0x0000000003EA0048>
CACHEDIR=C:\Users\ishma\.matplotlib
Using fontManager instance from C:\Users\ishma\.matplotlib\fontList.cache
backend Qt5Agg version 5.6
Animation.save using <class 'matplotlib.animation.FFMpegWriter'>
frame size in pixels is 640 x 480
MovieWriter.run: running command: ffmpeg -f rawvideo -vcodec rawvideo -s 640x480 -pix_fmt rgba -r 5.0 -i pipe: -vcodec h
264 -pix_fmt yuv420p -y test.gif
MovieWriter.grab_frame: Grabbing frame.
findfont: Matching :family=sans-serif:style=normal:variant=normal:weight=400:stretch=normal:size=10.0 to DejaVu Sans (u'
C:\\Users\\ishma\\Anaconda2\\lib\\site-packages\\matplotlib\\mpl-data\\fonts\\ttf\\DejaVuSans.ttf') with score of 0.0000
00
MovieWriter.grab_frame: Grabbing frame.
MovieWriter -- Error running proc:
None
None
MovieWriter -- Command stdout:
None
MovieWriter -- Command stderr:
None
Traceback (most recent call last):
File ".\anim_test.py", line 22, in <module>
ani.save("test.gif")
File "C:\Users\ishma\Anaconda2\lib\site-packages\matplotlib\animation.py", line 1063, in save
writer.grab_frame(**savefig_kwargs)
File "C:\Users\ishma\Anaconda2\lib\site-packages\matplotlib\animation.py", line 336, in grab_frame
'with --verbose-debug.'.format(e, out, err))
IOError: Error saving animation to file (cause: [Errno 22] Invalid argument) Stdout: None StdError: None. It may help to
re-run with --verbose-debug.
如果我将输出文件类型切换为mp4,则代码可以正常工作。在阅读了生成视频文件错误的人的许多帖子之后,我觉得我已经尝试了不同编写器的每个组合(包括FFMpegWriter,ImageMagickWriter,AVConvWriter和FileWriters),确保相关程序在我的PATH中,更改了设置在matplotlibrc中,尝试了多台计算机。我很难过。
我发现只有一个线程引用了这个确切的错误: https://stackoverflow.com/questions/46562938/oserror-errno-22-invalid-argument-error-saving-animation-to-file
但是根据评论中的建议,没有解决我的问题。
有什么想法吗?谢谢你的帮助。
答案 0 :(得分:4)
使用来自问题的代码,您基本上要求使用MPEG编写器生成动画gif。然而,MPEG编写器只能生成视频。
通过matplotlib动画模块生成动画gif的标准方法是使用ImageMagick。
首先将您的行改为
x
现在,为了实现这一点,rcParam ani.save("test.gif",writer="imagemagick")
必须指向ImageMagick的animation.convert_path
程序。
看来你在这里的窗户,所以最好包括它的完整路径。因此,在保存之前,设置
convert
或plt.rcParams["animation.convert_path"] = "C:\ProgramFiles\ImageMagick\convert.exe"
的任何路径。
现在可能会发生convert.exe
不再是较新版本的imageMagick的一部分了。 The documentation说
如果这些工具不可用,您只需将它们添加到magick工具中,如下所示:
convert.exe
。
对于matplotlib动画,这意味着您需要设置一个额外的参数。将路径设置为
magick convert
然后致电
plt.rcParams["animation.convert_path"] = "C:\ProgramFiles\ImageMagick\magick.exe"