web-dev-qa-db-ja.com

matplotlibを使用した3Dベクトルのプロット

Matplotlibを使用して3Dでベクトルをプロットしようとしています。 2Dベクトルをプロットする前の例に基づいて次のコードを使用しましたが、3Dベクトルのコンポーネントを追加しました。

#!/usr/bin/python

import numpy as np
import matplotlib.pyplot as plt

soa =np.array( [ [0,0,1,1,-2,0], [0,0,2,1,1,0],[0,0,3,2,1,0],[0,0,4,0.5,0.7,0]]) 

X,Y,Z,U,V,W = Zip(*soa)
plt.figure()
ax = plt.gca()
ax.quiver(X,Y,Z,U,V,W,angles='xyz',scale_units='xyz',scale=1,color='b')
ax.set_xlim([-1,10])
ax.set_ylim([-1,10])
ax.set_zlim([10,1])
plt.draw()
plt.show()

これを微調整して3Dベクトルプロットを作成する方法についてのアイデアはありますか?

15
jms1980

Mpl_toolkitsのmplot3dからAxes3Dを使用し、サブプロットの投影を3dに設定する必要があります。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

soa = np.array([[0, 0, 1, 1, -2, 0], [0, 0, 2, 1, 1, 0],
                [0, 0, 3, 2, 1, 0], [0, 0, 4, 0.5, 0.7, 0]])

X, Y, Z, U, V, W = Zip(*soa)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.quiver(X, Y, Z, U, V, W)
ax.set_xlim([-1, 0.5])
ax.set_ylim([-1, 1.5])
ax.set_zlim([-1, 8])
plt.show()

注: matplotlibの古いバージョンでは、このコードでエラーが発生することがよくあります。少なくともバージョン1.5を使用してみてください

produced_output

18
Tim B

他の回答とコメントから、matplotlibのバージョンには明らかに違いがあります。しかし、私はティムBの答えが質問に答えないと信じています。プロットされた矢筒は、その大きさが適切に表されていないため、与えられたベクトルを表していません。また、矢印は、ベクトルの目的の開始点にあるように見えます。

前の回答のコードを修正した次のコードは、python2.7matplotlib1.5.3に目的の結果を生成します。ベクトルを視覚化するには、ピボットポイントをpivot='tail'に設定し、ベクトルの大きさで矢筒をスケーリングすると、望ましい効果が得られます。矢筒の矢じりは、矢筒の長さの比率としてスケーリングされます。ここでは、スケーリング係数をベクトルの大きさで割って、すべての矢印をarrow_length_ratio=0.3/vlengthで同じサイズにします。

悪い点-私のコードはあまりコンパクトではありません。 ax.quiverの呼び出しごとに異なるkwargsを使用するには、X、Y、Z、U、V、Wをアンパック形式で提供する必要がありました。誰もがkwargsをパックする編集を提案できるなら、私は非常に感謝するでしょう。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

vectors=np.array( [ [0,0,1,1,-2,0], [0,0,2,1,1,0],[0,0,3,2,1,0],[0,0,4,0.5,0.7,0]]) 
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
for vector in vectors:
    v = np.array([vector[3],vector[4],vector[5]])
    vlength=np.linalg.norm(v)
    ax.quiver(vector[0],vector[1],vector[2],vector[3],vector[4],vector[5],
            pivot='tail',length=vlength,arrow_length_ratio=0.3/vlength)
ax.set_xlim([-4,4])
ax.set_ylim([-4,4])
ax.set_zlim([0,4])
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.show()

出力: matplotlib-1.5.3で矢筒としてベクトルをプロット

3
Dave