Line3D
Вы можете получить исходные данные из атрибута (private) _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_data
или get_xdata
заключается в том, что он вернет проекционные координаты, как только будет нарисована фигура.Таким образом, хотя до рисования фигуры line.get_xdata()
действительно возвращало бы правильные значения, после рисования она возвращала бы что-то вроде
[ -6.14413090e-02 -3.08824862e-02 -3.33066907e-17 3.12113190e-02 6.27567511e-02]
в приведенном выше примере, который является компонентом x трехмерных координат, спроецированных на2D.
Для matplotlib существует запрос pull, который позволит получить данные с помощью методов get_data_3d
.Это все еще не объединено, но может позволить сделать вышеизложенное без использования закрытых аргументов в будущей версии matplotlib.
Poly3DCollection
Для графика plot_surface
это выглядит аналогично, за исключением того, чтоатрибут, на который нужно смотреть, это ._vec
surf = ax.plot_surface(X, Y, Z)
xdata, ydata, zdata, _ = surf._vec
print(xdata)