Ваш код берет данные из вашего последнего выбора, так как первое, что вы делаете при запуске сценария, это не сбор данных (который затем обрабатывается), но вы читаете в своих данных с последнего запуска скрипт. По этой же причине вы получаете сообщение об ошибке при первом запуске сценария (или переименовании файла маринования), поскольку он пытается прочитать файл маринованных данных, который еще не существует.
Путем подключения функции 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:
Отредактировал код, чтобы вам не приходилось нажимать клавишу для обработки данных.