3

我制作了一个简单的 n 体模拟器,并使用以下代码绘制/动画运动:

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体交互示例: 在此处输入图像描述

4

3 回答 3

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'])
于 2013-05-26T10:32:59.153 回答
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)
于 2013-05-24T22:50:05.123 回答
2

简单但有效的解决方案是pylab.savefig(filename)在循环中使用并为每一帧保存一个文件,即在pylab.draw(). 文件名应该反映循环索引,即frame0001.png, frame0002.png, ... 然后使用 FFmpeg ( http://www.ffmpeg.org/ ) 将它们拼接在一起。已经有一个问题和一个答案,它是如何工作的(从一组 jpeg 图像创建动画 gif)。FFmpeg 有很多选择。例如,您可以调整帧速率。

于 2013-05-24T23:10:58.393 回答