Как получить позицию вокселя pyplot во время события onpick? - PullRequest
0 голосов
/ 24 сентября 2019

Кажется, есть разница между исполнителями стандартных функций 2D-черчения, таких как .plot или .scatter и Poly3DCollection, которые возвращает mplot3d .voxels.Я не могу понять, как получить какую-то позицию x, y, z из вокселей, на которые я нажимаю:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_title('click on points')
voxels = ax.voxels(np.random.rand(10,10,10) > 0.95, picker=5)  # 5 points tolerance

def onpick(event):
    print(event.__dict__.keys())
    print(event.artist.__dict__.keys())
    # Nothing in the objects I get seems to contain x y z information.

fig.canvas.mpl_connect('pick_event', onpick)

plt.show()

Я пытался просмотреть документацию Poly3DCollection API и некоторые базовые классыЯ пытался реализовать некоторый код, который я нашел внутри этого datacursor пакета, но я не могу заставить его работать.

Воксели находятся в целочисленной сетке, так что все сЦелочисленная точность хороша, если вы можете получить какой-то идентификатор, который я могу сопоставить с позицией вокселя, это тоже нормально.

1 Ответ

1 голос
/ 24 сентября 2019

event.artist - это воксель, на который вы нажали.Вы можете найти его в словаре, возвращаемом ax.voxels, чтобы получить его координаты.

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits import mplot3d

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.set_title('click on points')
voxels = ax.voxels(np.random.rand(10,10,10) > 0.95, picker=5)  # 5 points tolerance

def onpick(event):    
    for coords, voxel in voxels.items():
        if voxel == event.artist:
            print(coords)


fig.canvas.mpl_connect('pick_event', onpick)

plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...