跟进问题:pick_event使用matplotlib取得要点

时间:2019-01-25 05:19:08

标签: python matplotlib

我真的是python新手。 我对此有一个后续问题(pick_event to get a point using 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 :(得分:0)

您的代码从上次选择中获取数据,因为运行脚本时您要做的第一件事不是选择数据(然后将其腌制),而是您从上次运行代码时读取了腌制数据脚本。这也是为什么在您第一次运行脚本(或重命名泡菜文件)时会出错的原因,因为该脚本试图读取尚不存在的泡菜数据文件。

通过连接该行中的onpick函数

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

您尚未调用它。您仅在选择时调用它,届时正在读取您的腌制数据的代码部分将已经执行。要真正得到腌制后的腌制食品,您必须调用此代码

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

onpick函数内部或仅在您实际选取一个点后触发的另一个函数中(例如,连接'key_press_event',这将打印出您的腌制数据)。

编辑

例如,您的代码可能如下所示:

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”以显示腌制文件中存储的内容时,您会看到实际上实际上在正确地存储数据,只是不是< em>在正确的时间阅读。

编辑2: 编辑了代码,因此您无需按任何键即可处理数据。