我有一个动画的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'
这些似乎都没有起作用。
我在Windows 10上,并且正在使用Python 3.7
答案 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)
答案 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()
。当您关闭绘图时,它将正确保存动画。