Ответьте на вопрос: pick_event, чтобы получить очки с помощью matplotlib - PullRequest
0 голосов
/ 25 января 2019

Я действительно новичок в питоне.У меня есть дополнительный вопрос к этому ( pick_event, чтобы получить точку, используя matplotlib ):

У меня есть несколько точек данных, и я хочу выбрать определенный с функцией, а затемпоэкспериментируйте с этим позже, используя переменную рабочую область.

Так что я бы хотел сохранить, а не только распечатать переменную.Как я могу это сделать?Я пробовал несколько разных способов (маринование работает почти правильно), но, к сожалению, его всегда на шаг позади.Поэтому, когда я на самом деле запускаю скрипт, он берет данные из моего последнего выбора, а не фактического выбора.Я предполагаю, что это как-то связано со временем выполнения

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

.Но я действительно не знаю, как с этим справиться.Очень благодарен за любую помощь!

Мой код выглядит так:

import numpy as np
import matplotlib.pyplot as plt
import pickle

def onpick(event):
    thisline = event.artist
    xdata = thisline.get_xdata()
    ydata = thisline.get_ydata()
    ind = event.ind
    points = tuple(zip(xdata[ind], ydata[ind]))
    example_dict = {points}
    pickle_out = open("point.pickle","wb")
    pickle.dump(example_dict, pickle_out)
    pickle_out.close()
    print('onpick points:', points)


fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click on points')
line = ax.plot(np.random.rand(100), 'o', picker=5)  # 5 points tolerance
plt.show()
fig.canvas.mpl_connect('pick_event', onpick)

pickle_in = open("point.pickle","rb")
point = pickle.load(pickle_in)
print('After picking:')
print(point)

1 Ответ

0 голосов
/ 25 января 2019

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

Путем подключения функции onpick в строке

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

Вы еще не звоните . Вы вызываете его только тогда, когда выбираете, и к этому моменту часть кода, которая читает ваши засоленные данные, уже выполнена. Чтобы получить то, что мариновано после того, как вы выберете , вам нужно будет позвонить по этому коду

point = pickle.load(open("point.pickle","rb"))
print('After picking:')
print(point)

либо внутри функции onpick, либо в другой функции, которую вы активируете только после того, как фактически выберете точку (например, подключите 'key_press_event', который будет распечатывать ваши протравленные данные).

EDIT

Например, ваш код может выглядеть так:

import numpy as np
import matplotlib.pyplot as plt
import pickle

def onpick(event):
    thisline = event.artist
    xdata = thisline.get_xdata()
    ydata = thisline.get_ydata()
    ind = event.ind
    points = tuple(zip(xdata[ind], ydata[ind]))
    example_dict = {points}
    pickle_out = open("point.pickle","wb")
    pickle.dump(example_dict, pickle_out)
    pickle_out.close()
    print('onpick points:', points)
    postProcess()

def postProcess():
    pickle_in = open("point.pickle","rb")
    point = pickle.load(pickle_in)
    print('After picking:')
    print(point)

fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_title('click on points')
line = ax.plot(np.random.rand(100), 'o', picker=5)  # 5 points tolerance
plt.show()
fig.canvas.mpl_connect('pick_event', onpick)

Теперь, когда вы выбираете точку щелчком мыши, а затем нажимаете «p», чтобы показать, что хранится в вашем маринованном файле, вы можете видеть, что вы действительно правильно храните свои данные, вы просто не чтение это в нужный момент.

РЕДАКТИРОВАТЬ 2: Отредактировал код, чтобы вам не приходилось нажимать клавишу для обработки данных.

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