Using key_press_event to select a 'mode' for different types of pick_event

Using key_press_event to select a 'mode' for different types of pick_event

我一直在努力创建一个交互式绘图选择器,其中我有 3 个不同的 pick_events。这些 pick_events 每个都有一个计算。我想按“1”、“2”或“3”,它将成为相应 pick_event 的模式,我希望它保持该模式,直到按下另一个模式。到目前为止,我已经尝试过这段代码,但我对 OOP 缺乏经验并正在尝试学习。

class MyClick(object):
    def __init__(self):

    def pick(self, event):
        artist = event.artist
        xmouse, ymouse = event.mouseevent.xdata, event.mouseevent.ydata
        self.x, self.y = np.array(artist.get_xdata()),np.array(artist.get_ydata())
        self.ind = event.ind
        #self.maxind = self.y[self.ind].argsort()[-1:] #[::-1]
        #axes.plot(x[ind[self.maxind]],y[ind[self.maxind]],'*')
        #figure.canvas.draw()

    def press(self, event):
        sys.stdout.flush()
        if event.key == '1':
            # peak
            self.maxind = self.y[self.ind].argsort()[-1:] #[::-1]
            print(y[ind[self.maxind]])
        elif event.key == '2':
            # onset
            print('onset')
        elif event.key == '3':
            # offset
            print('offset')
        else:
            print('wrong key press')

if __name__ == "__main__":
    figure = plt.figure()
    axes = figure.add_subplot(1, 1, 1)
    data_plot, = axes.plot(Frame, R_Fz_dn_bc , picker=5) #plot data
    axes.autoscale(tight=True)

    browser = MyClick()
    cid = figure.canvas.mpl_connect('pick_event', browser.pick)
    cid = figure.canvas.mpl_connect('key_press_event', browser.press)

    plt.show()

我省略了一些与此无关的代码。我尝试制作 3 种不同的选择器功能,但也尝试制作一个选择器功能并在每个按键事件功能中进行计算。任何帮助将不胜感激。几周来我一直在努力解决这个问题。我也在寻找一种在 numpy 数组中选取点的方法,这样我可以稍后进行其他计算。

谢谢!

PS: 如果之前有关于这个的话题,我很抱歉。我还没有找到任何东西,如果有的话请指点我!

您可以使用press()方法记录最后按下的键作为MyClick实例的属性,然后在pick()方法中检查当前处于活动状态的模式并执行任何计算都是合适的:

class MyClick(object):

    def __init__(self):

        # initialize mode
        self._mode = 1

    def pick(self, event):
        """do some calculation depending on the last key pressed"""

        if self._mode == 1:
            # do something...
            pass

        elif self._mode == 2:
            # do something different...
            pass

        elif self._mode == 3:
            # do something else entirely...
            pass

    def press(self, event):
        """record last key pressed"""

        if event.key == '1':
            self._mode = 1

        elif event.key == '2':
            self._mode = 2

        elif event.key == '3':
            self._mode = 3