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


134

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


2
Jupyter Notebookでインタラクティブに回転する方法を疑問に思う方への付記:次のように使用できます%matplotlib notebook
YvesgereY

また、マウスの右ボタンを押しながらドラッグすると、カメラの距離が変わります。
LoMaPh 2018

この種の可視化のために、マヤビを試してみます。
タクトポダ

回答:


158

「カメラの位置」によって、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)

26
それに負けない!余談ですが、これらはax.elevおよびax.azimプロパティとして使用できます。また、単に書き込んax.azim = iiだりax.azim += 1、同じ効果を達成したりすることもできます。
Joe Kington、

1
申し訳ありませんが、あなたを倒しましたが、至る所で公平なポイントです。これも私のコーディングの抜粋であり、そのforループ内には、view_initとsavefigだけではありませんでした。=)
cosmosis 2012年

4
cosmosisとJoeに感謝します。それがまさに私が探していたものです。何を探すべきかわかったので、ax.azimとax.elevとともに、極座標でカメラの位置を設定できるax.distも見つけました。
Andreas Bleuler、2012年

これが答えである場合、チェックマークを付けていただけますか?ありがとう。
-cosmosis

12
カメラとオブジェクトポイント間の距離をax.dist = 15(デフォルトは10)で設定することもできます
Tim

14

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

PYTHONで...

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])     #...

ハックスカラー乗算を呼び出すための+1。あなたが見通しを望んでいたならば、それは非常に迷惑です。
user5920660
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.