我要用matplotlib绘制的每个点都有3d点和表面法线的列表。列表大小为千分之一。
我可以轻松地绘制点,但是在绘制线(以显示法线)时,我尝试了3种方法,但均未获得理想的结果。
第一种方法是按照此问题的解决方案遍历每行。这可行,但是非常慢。
第二种方法似乎适用于2d图,是在给定图的x,y列表中隔行扫描“ Nones”。就像本网站介绍的最后一种方法一样。但是,在3d中绘图时,这似乎不起作用。
我尝试过的第三种方法(对于2d效果很好)是使用LineCollection。但是,当我传递3d点时,它会引发异常,并抱怨“'顶点'必须是形状为Nx2的2D列表或数组”。因此,LineCollection似乎不支持3d。
有人知道如何使用matplotlib有效地绘制大量3d线段吗?
我找到了一种做自己想要的方法。查看颤动代码,我发现它内部使用Line3DCollection。然后,我还找到了使用Line3DCollection 对该问题的可接受答案。Line3DCollection的用法与LineCollection相同,但是现在的点是3元组而不是2元组。
您可以这样使用它:(假设p1和法线是(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)
Run Code Online (Sandbox Code Playgroud)
但是,与此图交互非常慢。我必须对数据进行采样并显示四分之一的法线才能具有任何交互性。另外,matplotlib 3d绘图的3d导航有点令人沮丧,我一直在奋斗一段时间以获得正确的观点,但我做不到。因此,也许matplotlib不是完成这项工作的理想工具。
归档时间: |
|
查看次数: |
1275 次 |
最近记录: |