2016-11-08 94 views
2

我有我想用matplotlib繪製的每個點的3d點和曲面法線的列表。列表大小是千分之十。Matplotlib:如何在3D中高效地繪製大量線段?

我可以很容易地繪製點,但是當繪製線(顯示法線)時,我嘗試了3種方法,但沒有獲得所需的結果。

第一種方法是迭代每行,如this問題的解決方案。這有效,但速度非常慢。

第二種方法,似乎適用於二維圖,是交給給陰謀的x,y列表中的'Nones'。就像在this網站上解釋的最後一個方法一樣。但是,這在3D中繪製時似乎不起作用。

我試過的第三種方法,對於2D來說效果很好,就是使用LineCollection。但是,當我傳遞3d點時,會引發異常抱怨,「頂點」必須是2D列表或形狀爲Nx2的數組「。所以它看起來不像LineCollection支持3d。

有誰知道如何有效地繪製matplotlib大量的3D線段?

回答

2

我發現了一種做我想做的事的方式。看看顫抖的代碼,我發現它內部使用Line3DCollection。然後我還找到了使用Line3DCollection的this問題的接受答案。 Line3DCollection可以與LineCollection相同的方式使用,但現在的點是3元組而不是2元組。

您可以使用它像這樣: (假設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

但是,與此情節交互非常緩慢。我必須對我的數據進行抽樣並顯示四分之一的法線能夠具有任何交互性。此外,matplotlib 3D圖的3D導航圖有點令人沮喪,我一直在爭取一段時間以獲得正確的觀點,但我不能。所以也許matplotlib不是這份工作的理想工具。