web-dev-qa-db-ja.com

matplotlibで回転3Dグラフをアニメーション化する

散布図を設定し、希望どおりにプロットしました。plt.show()を使用して視点をドラッグしたかのように、空間で回転している図の.mp4ビデオを作成します。

この答え はほぼ正確に望みますが、ムービーを保存するには、画像のフォルダーを使用して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")
22
Nate

matplotlibアニメーションについて詳しく知りたい場合は、実際に このチュートリアル に従ってください。アニメーションプロットの作成方法について詳しく説明しています。

注:アニメーションプロットを作成するには、ffmpegまたはmencoderをインストールする必要があります。

これは、散布図で機能するように変更された彼の最初の例のバージョンです。

# 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'])
32
Viktor Kerkez

私がこれに偶然出会ったとき、matplotlibで私のプロットをアニメーション化することを検討していました: http://zulko.wordpress.com/2012/09/29/animate-your-3d-plots-with-pythons-matplotlib/ =

プロットの周りをアニメーション化し、さまざまな形式で出力する簡単な機能を提供します。

9
Jameshobbs

少しハックですが、Jupyterノートブックを使用している場合は、セルマジックを使用して、ノートブック自体から直接コマンドラインバージョンのffmpegを実行できます。 1つのセルでスクリプトを実行して生フレームを生成します

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
1
wil3