Matplotlib: ax.format_coord () на графике трехмерного трисурфа - вернуть (x, y, z) вместо (азимут, высота)? - PullRequest
0 голосов
/ 11 мая 2018

Я пытался повторить этот уже отвеченный вопрос Matplotlib - plot_surface: получить значения x, y, z, записанные в правом нижнем углу , но не смог получить тот же результат, как указано там. Итак, у меня есть код вроде:

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from plyfile import PlyData, PlyElement

#Handle the "onclick" event
def onclick(event):
    print('%s click: button=%d, x=%d, y=%d, xdata=%f, ydata=%f' %
          ('double' if event.dblclick else 'single', event.button,
           event.x, event.y, event.xdata, event.ydata))
    print(gety(event.xdata, event.ydata))

#copied from /6177895/matplotlib-plotsurface-poluchit-znacheniya-x-y-z-napisannye-v-pravom-nizhnem-uglu
def gety(x,y):
    s = ax.format_coord(x,y)
    print(s) #here it prints "azimuth=-60 deg, elevation=30deg"
    out = ""
    for i in range(s.find('y')+2,s.find('z')-2):
        out = out+s[i]
    return float(out)

#Read a PLY file and prepare it for display
plydata = PlyData.read("some.ply")
mesh = plydata.elements[0]
triangles_as_tuples = [(x[0], x[1], x[2]) for x in plydata['face'].data['vertex_indices']]
polymesh = np.array(triangles_as_tuples)

#Display the loaded triangular mesh in 3D plot
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_trisurf(mesh.data['x'], mesh.data['y'], mesh.data['z'], triangles=polymesh, linewidth=0.2, antialiased=False)
fig.canvas.mpl_connect('button_press_event', onclick)
plt.show()

При этом треугольная поверхность отображается правильно (хотя и медленно). Я могу видеть (x, y, z) координаты поверхности в правом нижнем углу, пока я наводю курсор на график. Но когда я пытаюсь получить эти координаты щелчком мыши (через подключенный обработчик событий), функция ax.format_coord (x, y) возвращает не строку декартовых координат, а строку "azimuth = -60 deg, Высота = 30 градусов ", независимо от того, где на графике я нажимаю, пока поверхность не будет повернута. Затем он возвращает другие значения. Отсюда я полагаю, что это сферические координаты текущего вида, а не точки, по которой щелкают, по какой-то причине ...

Может кто-нибудь узнать, что я делаю не так? Как я могу получить декартовы координаты на поверхности?

К вашему сведению: все это связано с моим предыдущим вопросом Python: Графический ввод в 3D , который считался слишком широким и общим.

1 Ответ

0 голосов
/ 11 мая 2018

Нажатая кнопка мыши является триггером для ax.format_coord возврата угловых координат на трехмерном графике вместо декартовых.Таким образом, вариант - позволить ax.format_coord думать, что ни одна кнопка не нажата, и в этом случае он будет возвращать обычные декартовы координаты x, y, z по желанию.

Немного хакерского способадобиться этого, даже если вы нажали кнопку мыши, было бы установить ax.button_pressed (в котором хранится текущая кнопка мыши) на что-то необоснованное при вызове этой функции.

def gety(x,y):
    # store the current mousebutton
    b = ax.button_pressed
    # set current mousebutton to something unreasonable
    ax.button_pressed = -1
    # get the coordinate string out
    s = ax.format_coord(x,y)
    # set the mousebutton back to its previous state
    ax.button_pressed = b
    return s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...