将动画Matplotlib图表保存到GIF

时间:2019-06-03 07:57:53

标签: python matplotlib ffmpeg imagemagick

我有一个动画的matplotlib图表,试图将其保存到.gif文件,但是我无法让图像编写器正常工作。

我已经安装了imagemagick并按照其installation page上给出的说明验证了它在我的计算机上可以正常工作,但是当我这样做时:

anim.save('gd.gif', writer='imagemagick')

我收到以下错误消息:

MovieWriter imagemagick unavailable. Trying to use pillow instead.

但是,进行anim.save('gd.gif', writer='pillow')会显示以下错误消息:

ValueError: not enough image data

我尝试使用命令conda install -c conda-forge ffmpeg安装ffmpeg。它看起来好像已正确安装,但我显然不知道如何将其绑定到matplotlib。

将writer指定为ffmpeg会给出与imagemagick相同的错误消息。

我还尝试使用以下行将imagemagick的路径添加到matplotlib的配置文件路径:

animation.convert_path: 'C:\Program Files\ImageMagick-7.0.8-Q16\magick.exe'

那是suggested in this question

这些似乎都没有起作用。

我在Windows 10上,并且正在使用Python 3.7

2 个答案:

答案 0 :(得分:1)

我从互联网上夹了这段代码,这最初是行不通的。
我改变了这一行:

rcParams['animation.convert_path'] = r'/usr/bin/convert'

指向我的convert二进制文件,它启动了。 诚然,这是在Linux上,但我认为它不应该有所不同。 正如Mark Setchell在对原始问题的评论中所指出的那样,看来binary的名称很可能取决于您使用的版本/操作系统。为了确定要使用哪个,我建议先在command line上尝试使用该命令。
例如在Linux上对我来说:

convert -version

给予:

Version: ImageMagick 6.9.7-4 Q16 x86_64 20170114 http://www.imagemagick.org

您的里程可能会有所不同!尤其是因为我不再记得在Windows操作系统上发布终端命令的情况。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from matplotlib import rcParams

# configure full path for ImageMagick
rcParams['animation.convert_path'] = r'/usr/bin/convert'

TWOPI = 2*np.pi

fig, ax = plt.subplots()

t = np.arange(0.0, TWOPI, 0.001)
s = np.sin(t)
l = plt.plot(t, s)

ax = plt.axis([0,TWOPI,-1,1])

redDot, = plt.plot([0], [np.sin(0)], 'ro')

def animate(i):
    redDot.set_data(i, np.sin(i))
    return redDot,

# create animation using the animate() function with no repeat
myAnimation = animation.FuncAnimation(fig, animate, frames=np.arange(0.0, TWOPI, 0.1), \
                                      interval=10, blit=True, repeat=False)

# save animation at 30 frames per second
myAnimation.save('myAnimation.gif', writer='imagemagick', fps=30)

enter image description here

答案 1 :(得分:0)

一个快速的解决方法是在运行PCollectionTuple tuple= PCollectionTuple.of(new TupleTag<>("testPcollection"), testPcollection); PCollection<Row> result = tuple .apply(SqlTransform.query( "SELECT array[(firstname_1,lastname_1,dob), (firstname_2,lastname_2,dob), (firstname_3,lastname_3,dob)]")); 之前简单地添加plt.show()。当您关闭绘图时,它将正确保存动画。