2016-11-08 26 views
2

私は、matplotlibでプロットしたい各点の3D点とサーフェス法線のリストを持っています。 リストのサイズは10分の1です。Matplotlib:効率的に多数の線分を3Dにプロットするには?

ポイントを簡単にプロットすることができますが、線をプロットすると(法線を表示するために)私は3つのアプローチを希望の結果なしで試しました。

最初のアプローチは、thisの解決策のように、各行で繰り返されます。これは動作しますが、非常に遅いです。

2dプロットでうまくいくように見える2番目の方法は、プロットに与えられたx、yリストに「Nones」を飛ばすことです。最後の方法はthisウェブサイトで説明したように。しかし、これは3Dでプロットするときには機能しません。

私が試した3番目のアプローチは、2dでうまくいくのはLineCollectionを使うことです。しかし、3Dポイントを渡すと、「頂点は2DリストまたはシェイプNx2の配列でなければなりません」という例外が発生し、例外が発生します。だからLineCollectionは3dをサポートしているように見えません。

matplotlibを使用して多数の3D線分を効率的に描画する方法を知っている人はいますか?

答えて

2

私が望んでいたやり方を見つけました。私は、内部的にLine3DCollectionを使用していることがわかりました。次に、Line3DCollectionを使用しているthis質問への回答が見つかりました。 Line3DCollectionはLineCollectionと同じ方法で使用できますが、ポイントは2タプルではなく3タプルです。

あなたはこのようにそれを使用することができます:

(仮定P1Sと法線が(Nは、3)の行に保存されているポイントと法線とのnumpyのアレイ、およびLINE_SIZEはどのくらいあなたがする通常を表す線を望んでいます)
from mpl_toolkits.mplot3d.art3d import Line3DCollection 

plt.figure() 
ax = fig.gca(projection='3d') 
ax.plot(p1s[:,0], p1s[:,1], p1s[:,2], '.r', markersize=3) 
p2s = p1s + normals*line_size 
ls = np.hstack([p1s, p2s]).copy() 
ls = ls.reshape((-1,2,3)) 
lc = Line3DCollection(ls, linewidths=0.5, colors='b') 
ax.add_collection(lc) 

これにより、私は望む視覚化を多かれ少なかれ実現しました。すなわち、 enter image description here

ただし、このプロットとのやりとりは非常に遅いです。私は自分のデータをサンプリングし、どんなインタラクティブ性も持つことができるように法線の4分の1を示しなければなりませんでした。また、matplotlib 3dの3Dナビゲーションでは少しイライラしています。私は正しい視点を得るためにしばらく戦ってきましたが、できませんでした。 matplotlibはこの仕事にとって理想的なツールではないかもしれません。

関連する問題