我制作了一个简单的n-body模拟器,并使用以下代码绘制/动画运动:
for i in range(N):
[...]
x = [ Rbod[j][0], Rbod[j][0]]
y = [ Rbod[j][1], Rbod[j][1]]
#print(R1, V1, A1, F12)
if i%10 == 0:
print(i)
pylab.ion()
pylab.scatter( x, y, c=(j/nbodies,j/nbodies,j/nbodies) )
pylab.axis([-400, 400, -400, 400])
pylab.draw()
现在我真的想将动画保存为gif。这可能吗?互联网模糊地说,这不是关于如何用pylab
做到的。
4身体互动的例子:
答案 0 :(得分:7)
我使用ffmpeg解决了这个问题,转换程序通过命令行运行。 所以首先我保存所有单独的图片,然后将它们变成avi,将avi变成gif。
print(i)
#pylab.ion()
pylab.scatter( x, y, c=(j/nbodies,j/nbodies,j/nbodies) )
pylab.axis([-400, 400, -400, 400])
#pylab.draw()
pylab.savefig('picture'+str(i))
os.chdir('C://Users/Alex')
subprocess.call(['ffmpeg', '-i', 'picture%d0.png', 'output.avi'])
subprocess.call(['ffmpeg', '-i', 'output.avi', '-t', '5', 'out.gif'])
答案 1 :(得分:2)
在matplotlib中查看关于动画的本教程。 http://nbviewer.ipython.org/urls/raw.github.com/jakevdp/matplotlib_pydata2013/master/notebooks/05_Animations.ipynb
快速搜索显示如何将动画创建为mp4,然后您可以使用第三方工具将其转换为您想要的格式。
from matplotlib import animation
# call the animator.
...
anim = animation.FuncAnimation(fig, animate, init_func=init,
frames=200, interval=20, blit=True)
...
anim.save('basic_animation.mp4', fps=30)
答案 2 :(得分:2)
简单但有效的解决方案是在循环中使用pylab.savefig(filename)
并为每个帧保存文件,即在pylab.draw()
之后。文件名应反映循环索引,即frame0001.png
,frame0002.png
,...然后使用FFmpeg(http://www.ffmpeg.org/)将它们拼接在一起。已经有一个问题和答案是如何工作的(Create animated gif from a set of jpeg images)。 FFmpeg有很多选择。例如,您可以调整帧速率。