Matplotlib:如何高效地在3D中绘制大量的线段?

4
我有一个由数万个3D点和每个点的表面法线构成的列表,我想用matplotlib进行绘制。 虽然我可以很容易地绘制点,但是在绘制线(以展示法线)时,我尝试过三种方法,但都没有达到预期的结果。
第一种方法是对每条线进行迭代,就像这个问题的解决方案。这个方法能够正常工作,但速度非常慢。
第二种方法,看起来适用于2D绘图,就是将Nones交错插入到plot函数提供的x,y列表中。就像这个网站上解释的最后一个方法。但是,当在3D绘图时,它似乎不起作用。
第三种方法,适用于2D且效果良好的方法,是使用LineCollection。但是,当我传递3D点时,它会引发一个异常,抱怨“'vertices' must be a 2D list or array with shape Nx2”。因此,看来 LineCollection 不支持3D。
有人知道如何有效地使用matplotlib绘制大量的3D线段吗?
1个回答

8
我找到了一种实现我想要的功能的方法。查看quiver的代码后,我发现它内部使用了Line3DCollection。然后我还找到了这个问题的被接受答案,该答案使用了Line3DCollection。 Line3DCollection可以像LineCollection一样使用,但现在点是3元组而不是2元组。
您可以按照以下方式使用它: (假设p1s和normals是(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图的三维导航有点令人沮丧,我已经为了得到正确的视角而奋斗了一段时间,但没有成功。因此,也许matplotlib不是这项工作的理想工具。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接