web-dev-qa-db-ja.com

python / matplotlibを使用して3Dプロットの「カメラ位置」を設定する方法は?

Mplot3dを使用して3Dデータのニースプロットを作成する方法を学んでいますが、これまでのところかなり満足しています。私が今やろうとしているのは、回転する表面の小さなアニメーションです。そのためには、3D投影のカメラ位置を設定する必要があります。 matplotlibをインタラクティブに使用する場合、マウスを使用してサーフェスを回転できるため、これが可能であるに違いないと思います。しかし、どのようにスクリプトからこれを行うことができますか? mpl_toolkits.mplot3d.proj3dで多くの変換を見つけましたが、これらを目的に使用する方法を見つけることができず、私がやろうとしていることの例が見つかりませんでした。

117
Andreas Bleuler

「カメラ位置」とは、3Dプロットの表示に使用する仰角と方位角を調整したいように聞こえます。これは ax.view_init で設定できます。以下のスクリプトを使用して最初にプロットを作成し、次にプロットを表示するための適切な標高、またはelevを決定しました。次に、方位角またはazimを調整して、プロットの周囲の360度全体を変化させ、各インスタンスで図を保存します(プロットを保存するときにどの方位角に注意するか)。より複雑なカメラパンの場合は、仰角と角度の両方を調整して、目的の効果を実現できます。

    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)
136
cosmosis

便利なのは、カメラの位置を新しいプロットに適用することです。そこで、プロットしてから、マウスで距離を変えながらプロットを移動します。次に、別のプロット上の距離を含むビューを複製してみてください。 axx.ax.get_axes()が古い.azimと.elevのオブジェクトを取得することがわかりました。

パイソンで...

axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev
dst=axx.dist       # ALWAYS GIVES 10
#dst=ax1.axes.dist # ALWAYS GIVES 10
#dst=ax1.dist      # ALWAYS GIVES 10

後の3Dグラフ...

ax2.view_init(elev=ele, azim=azm) #Works!
ax2.dist=dst                       # works but always 10 from axx

編集1 ... OK、カメラの位置は.dist値に関する間違った考え方です。グラフ全体に対する一種のハッキースカラー乗数として、すべての上に乗っています。

これは、ビューの拡大/ズームに対して機能します。

xlm=ax1.get_xlim3d() #These are two tupples
ylm=ax1.get_ylim3d() #we use them in the next
zlm=ax1.get_zlim3d() #graph to reproduce the magnification from mousing
axx=ax1.get_axes()
azm=axx.azim
ele=axx.elev

後でグラフ...

ax2.view_init(elev=ele, azim=azm) #Reproduce view
ax2.set_xlim3d(xlm[0],xlm[1])     #Reproduce magnification
ax2.set_ylim3d(ylm[0],ylm[1])     #...
ax2.set_zlim3d(zlm[0],zlm[1])     #...
12
user1469620