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

时间:2016-11-08 14:24:47

标签: python matplotlib

我想用matplotlib绘制每个点的3d点和曲面法线列表。 列表大小是十分之一。

我可以轻松地绘制点,但是当绘制线条(显示法线)时,我尝试了3种方法而没有达到预期效果。

第一种方法是在this问题的解决方案中迭代每一行。这有效,但速度非常慢。

第二种方法似乎适用于2d图,是在给出绘图的x,y列表中交织'Nones'。就像this网站中解释的最后一种方法一样。但是,在3d中绘图时,这似乎不起作用。

我尝试过的第三种方法,适用于2d是使用LineCollection。然而,当我传递3d点时,它会引发并且异常抱怨“'顶点'必须是2D列表或具有形状Nx2的数组”。所以它看起来不像LineCollection支持3d。

有人知道如何用matplotlib有效地绘制大量的3d线段吗?

1 个答案:

答案 0 :(得分:3)

我找到了一种做我想做的事情的方法。查看箭袋的代码我发现它在内部使用了Line3DCollection。然后我还找到了this问题的接受答案,它使用了Line3DCollection。 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可能不是这项工作的理想工具。