【问题标题】:Get data from mplot3d graph从 mplot3d 图形中获取数据
【发布时间】:2019-05-20 18:45:42
【问题描述】:

我不知道如何从 mplot3d 图形中获取数据。类似于 2D 风格的东西:

line.get_xdata()

有可能吗?

【问题讨论】:

    标签: matplotlib mplot3d


    【解决方案1】:

    Line3D

    您可以从(私有)_verts3d 属性中获取原始数据

    xdata, ydata, zdata = line._verts3d
    print(xdata)
    

    完整示例

    import matplotlib as mpl
    from mpl_toolkits.mplot3d import Axes3D
    import numpy as np
    import matplotlib.pyplot as plt
    
    mpl.rcParams['legend.fontsize'] = 10
    
    fig = plt.figure()
    ax = fig.gca(projection='3d')
    
    # Prepare arrays x, y, z
    x = np.arange(5)
    y = np.arange(5)*4
    z = np.arange(5)*100
    
    line, = ax.plot(x, y, z, label='curve')
    
    fig.canvas.draw()
    
    xdata, ydata, zdata = line._verts3d
    print(xdata)  # This prints [0 1 2 3 4]
    
    plt.show()
    

    一些解释:get_dataget_xdata 的问题是一旦绘制图形就会返回投影坐标。因此,虽然在绘制图形之前,line.get_xdata() 确实会返回正确的值,但在绘制之后,它会返回类似

    [ -6.14413090e-02  -3.08824862e-02  -3.33066907e-17   3.12113190e-02 6.27567511e-02]
    

    在上面的例子中,它是投影到 2D 上的 3D 坐标的 x 分量。


    有一个pull request to matplotlib,它允许通过方法get_data_3d 获取数据。这仍然没有合并,但在未来版本的 matplotlib 中可能允许在不使用私有参数的情况下完成上述操作。

    Poly3DCollection

    对于plot_surface 图,这看起来很相似,除了要查看的属性是._vec

    surf = ax.plot_surface(X, Y, Z)
    xdata, ydata, zdata, _ = surf._vec
    print(xdata)
    

    【讨论】:

    • 优秀的答案,我会接受。但我不够具体。我对 plot_surface 图有疑问。曲面图有类似的方法吗?
    • 短期跟进:数据丢失了维度。它现在是最近的一维。我想用这些数据重新绘制。如何检索原始尺寸?
    • 我不确定您是否可以轻松做到这一点。
    • 仅供参考:PR 已合并,该功能将在下一个版本中出现。
    【解决方案2】:

    此问题已在 Github 上提交,并且有贡献添加了新的 get_data_3dset_data_3d 方法。不幸的是,这些更改可能尚未在发行版中提供。所以你可能不得不继续使用私有变量line._verts3d

    在此处查看更多信息:https://github.com/matplotlib/matplotlib/issues/8914

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      相关资源
      最近更新 更多