从 mplot3d 图形中获取数据

Get data from mplot3d graph

我不知道如何从 mplot3d 图形中获取数据。类似于 2D 样式的内容:

line.get_xdata()

可以吗?

三维直线

您可以从(私有)_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 的问题在于,一旦绘制图形,它将 return 投影坐标。因此,虽然在绘制图形之前,line.get_xdata() 确实 return 是正确的值,但在绘制之后,它会 return 类似于

[ -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)

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

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