使用Matplotlib导出动画gif [英] Exporting animated gif using matplotlib

查看:159
本文介绍了使用Matplotlib导出动画gif的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

几天来,我一直试图在Windows计算机上导出动画gif。

I've been trying to export an animated gif on my windows computer for several days.

以下是基本代码:

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中,并尝试了多台计算机。我很困惑。

If I switch the output file type to mp4, the code works. After reading many threads from people with errors producing video files, I feel like I have tried every combination of different writers (including FFMpegWriter, ImageMagickWriter, AVConvWriter, and the FileWriters as well), made sure the relevant programs are in my PATH, changed settings in matplotlibrc, and tried multiple computers. I'm stumped.

我只找到一个引用此确切错误的线程:
https://stackoverflow.com/questions/46562938/oserror-errno-22-invalid-argument-error-saving-animation-to-file

I've found only one thread referencing this exact error: https://stackoverflow.com/questions/46562938/oserror-errno-22-invalid-argument-error-saving-animation-to-file

但是按照评论中的建议,并没有解决我的问题。

But following the advice in the comments there haven't solved my problem.

有什么想法吗?谢谢您的帮助。

Any ideas? Thanks for any help.

推荐答案

使用问题中的代码,您基本上要求使用MPEG编写器生成动画gif。但是,MPEG编写器只能产生视频。

With the code from the question you are basically asking to produce an animated gif using the MPEG writer. The MPEG writer however is only able to produce videos.

通过matplotlib动画模块生成动画gif的标准方法是使用ImageMagick。

The standard way to produce an animated gif through the matplotlib animation module is to use ImageMagick.

因此,首先将您的行更改为

So first change your line to

ani.save("test.gif",writer="imagemagick")

现在可以使用rcParam animation.convert_path 必须指向ImageMagick的 convert 程序。

看来您在Windows上,所以最好包含完整的路径。因此,在保存之前,设置

Now for this to work the rcParam animation.convert_path must point to the ImageMagick's convert program.
It seems you are on windows here, so it's best to include the complete path to it. Hence, before the saving, set

plt.rcParams["animation.convert_path"] = "C:\ProgramFiles\ImageMagick\convert.exe" 

或您转换的路径。 exe

现在很可能出现 convert.exe 不是是imageMagick较新版本的一部分。 文档

Now it may apparently happen that convert.exe is not part of newer versions of imageMagick anymore. The documentation says


如果这些工具不可用,您可以简单地将它们附加到magick工具中,如下所示:

magick convert

对于matplotlib动画,这意味着您需要设置一个额外的参数。将路径设置为

For the matplotlib animation this means that you would need to set an extra argument. Set the path to

plt.rcParams["animation.convert_path"] = "C:\ProgramFiles\ImageMagick\magick.exe"

然后调用

ani.save("test.gif",writer="imagemagick", extra_args="convert")

这篇关于使用Matplotlib导出动画gif的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆