Как получить пользовательский объект при щелчке строки на рисунке matplotlib? - PullRequest
0 голосов
/ 09 сентября 2018

Matplotlib имеет выбираемые объекты, которые возвращают данные о выбранном объекте.

Пример (взят из здесь ):

fig, ax = plt.subplots()
ax.plot(np.random.rand(10))
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))
cid = fig.canvas.mpl_connect('button_press_event', onclick)

Но рядом с получением таких данных, как event.x или event.ydata, я хотел бы получить ссылку напользовательский объект.Где каждая отдельная точка на графике возвращает разные ссылки.Возможно ли это?

Редактировать:

Для пояснения, скажем, у меня есть список многих объектов:

objects = [SomeObject() for _ in range(10**10)]

Каждый из них может быть преобразован в некоторое значение, которое яplot:

points = [obj.to_value() for obj in objects]
ax.plot(points)

Теперь, когда я щелкаю такое построенное значение, я хочу получить доступ к объекту, из которого оно было получено.Кроме того, я бы предпочел, чтобы event, переданный методу onclick(...), содержал ссылку на этот объект вместо того, чтобы выполнять поиск по списку с объектами.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

Самый простой вариант - использовать pick_event, как описано в разделе Выбор объекта в документации.

import numpy as np
import matplotlib.pyplot as plt

class SomeObject():
    def __init__(self):
        self.value = np.random.rand()

    def to_value(self):
        return self.value

    def __repr__(self):
        return "This is object with value {}".format(self.to_value())

fig = plt.figure()
ax = fig.add_subplot(111)

objects = [SomeObject() for _ in range(10)]

points = [obj.to_value() for obj in objects]
ax.plot(points, "o-", picker=5) 

def onpick(event):
    ind = event.ind[0]
    obj = objects[ind]
    print(obj)

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

plt.show()
0 голосов
/ 09 сентября 2018

Вы должны быть более точными в отношении того, что вы называете "пользовательским объектом". Имеют ли эти объекты координаты, совпадающие с точками, нанесенными на график?

Если так, то я полагаю, что общий подход заключается в том, чтобы просто пройтись по списку пользовательских объектов и найти тот, который имеет те же координаты, что и те, которые возвращены click event (с разумным запасом ошибок).

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