Получить данные из графика mplot3d - PullRequest
0 голосов
/ 11 июня 2018

Я не могу узнать, как получить данные из графика mplot3d.Нечто похожее на стиль 2D:

line.get_xdata()

Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Эта проблема была подана на Github, и есть вклад, который добавляет новые get_data_3d и set_data_3d методы.К сожалению, эти изменения, вероятно, еще не доступны в дистрибутивах.Поэтому вам, возможно, придется продолжить использование закрытой переменной line._verts3d.

Подробнее здесь: https://github.com/matplotlib/matplotlib/issues/8914

0 голосов
/ 11 июня 2018

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