【问题标题】:Matplotlib: How to efficiently plot a large number of line segments in 3D?Matplotlib:如何有效地在 3D 中绘制大量线段?
【发布时间】:2017-03-22 05:23:56
【问题描述】:

对于我想用 matplotlib 绘制的每个点,我都有一个 3d 点和表面法线列表。 列表大小为十分之一。

我可以很容易地绘制点,但是在绘制线(以显示法线)时,我尝试了 3 种方法而没有达到预期的结果。

第一种方法是遍历每一行,就像this 问题的解决方案一样。这可行,但速度非常慢。

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

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

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

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    我找到了做我想做的事的方法。查看 quiver 的代码,我发现它在内部使用了 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)
    

    所以这(或多或少)实现了我想要的可视化。 IE。

    但是,与此情节的交互非常缓慢。我必须对我的数据进行采样并显示四分之一的法线才能进行任何交互。此外,matplotlib 3d 的 3d 导航绘图有点令人沮丧,我已经争取了一段时间才能获得正确的观点,但我做不到。所以也许 matplotlib 不是这项工作的理想工具。

    【讨论】:

      猜你喜欢
      • 2020-08-21
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 2021-03-08
      • 2015-08-02
      相关资源
      最近更新 更多