26

我设置了一个散点图并按照我想要的方式绘制它,并且我想创建一个在空间中旋转的图形的 .mp4 视频,就好像我使用plt.show()并拖动了视点一样。

这个答案几乎正是我想要的,除了保存电影,我必须手动调用带有图像文件夹的 FFMpeg。我宁愿使用 Matplotlib 内置的动画支持,而不是保存单个帧。代码转载如下:

from mpl_toolkits.mplot3d import Axes3D
ax = Axes3D(fig)
ax.scatter(xx,yy,zz, marker='o', s=20, c="goldenrod", alpha=0.6)
for ii in xrange(0,360,1):
    ax.view_init(elev=10., azim=ii)
    savefig("movie"%ii+".png")
4

4 回答 4

36

如果您想了解有关matplotlib动画的更多信息,您应该真正遵循本教程。它详细解释了如何创建动画情节。

注意:创建动画图需要ffmpegmencoder安装。

这是他的第一个示例的一个版本,已更改为与您的散点图一起使用。

# First import everthing you need
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D

# Create some random data, I took this piece from here:
# http://matplotlib.org/mpl_examples/mplot3d/scatter3d_demo.py
def randrange(n, vmin, vmax):
    return (vmax - vmin) * np.random.rand(n) + vmin
n = 100
xx = randrange(n, 23, 32)
yy = randrange(n, 0, 100)
zz = randrange(n, -50, -25)

# Create a figure and a 3D Axes
fig = plt.figure()
ax = Axes3D(fig)

# Create an init function and the animate functions.
# Both are explained in the tutorial. Since we are changing
# the the elevation and azimuth and no objects are really
# changed on the plot we don't have to return anything from
# the init and animate function. (return value is explained
# in the tutorial.
def init():
    ax.scatter(xx, yy, zz, marker='o', s=20, c="goldenrod", alpha=0.6)
    return fig,

def animate(i):
    ax.view_init(elev=10., azim=i)
    return fig,

# Animate
anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=360, interval=20, blit=True)
# Save
anim.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])
于 2013-08-20T21:42:41.757 回答
9

当我偶然发现这个时,我正在研究用 matplotlib 为我的情节制作动画:http: //zulko.wordpress.com/2012/09/29/animate-your-3d-plots-with-pythons-matplotlib/

它提供了简单的功能来围绕绘图制作动画并以多种格式输出。

于 2014-02-12T19:40:00.370 回答
1

Viktor Kerkez提供的解决方案对我不起作用(matplotlib 版本 3.4.2)。我收到与user3015729报告的相同错误。以下是产生相同结果但适用于 matplotlib 3.4.2 的改编版本。

# First import everthing you need
import numpy as np
from matplotlib import pyplot as plt
from matplotlib import animation
from mpl_toolkits.mplot3d import Axes3D

# Create some random data, I took this piece from here:
# http://matplotlib.org/mpl_examples/mplot3d/scatter3d_demo.py


def randrange(n, vmin, vmax):
    return (vmax - vmin) * np.random.rand(n) + vmin


n = 100
xx = randrange(n, 23, 32)
yy = randrange(n, 0, 100)
zz = randrange(n, -50, -25)

# Create a figure and a 3D Axes
fig = plt.figure()
ax = Axes3D(fig)
scat = ax.scatter(xx, yy, zz, marker='o', s=20, c="goldenrod", alpha=0.6)

# Create an init function and the animate functions.
# Both are explained in the tutorial. Since we are changing
# the the elevation and azimuth and no objects are really
# changed on the plot we don't have to return anything from
# the init and animate function. (return value is explained
# in the tutorial.


def init():
    ax.view_init(elev=10., azim=0)
    return [scat]


def animate(i):
    ax.view_init(elev=10., azim=i)
    return [scat]


# Animate
anim = animation.FuncAnimation(fig, animate, init_func=init,
                               frames=360, interval=20, blit=True)
# Save
anim.save('basic_animation.mp4', fps=30, extra_args=['-vcodec', 'libx264'])
于 2021-06-29T09:47:55.283 回答
1

这有点骇人听闻,但如果您使用的是 Jupyter 笔记本,您可以使用单元魔法直接从笔记本本身运行命令行版本的 ffmpeg。在一个单元格中运行您的脚本以生成原始帧

from mpl_toolkits.mplot3d import Axes3D
ax = Axes3D(fig)
ax.scatter(xx,yy,zz, marker='o', s=20, c="goldenrod", alpha=0.6)
for ii in xrange(0,360,1):
    ax.view_init(elev=10., azim=ii)
    savefig("movie%d.png" % ii)

现在,在一个新的笔记本单元格中,输入以下内容,然后运行该单元格

%%bash 
ffmpeg -r 30 -i movie%d.png -c:v libx264 -vf fps=25 -pix_fmt yuv420p out.mp4
于 2018-09-17T04:33:35.970 回答