使用key_press_event选择'模式'对于不同类型的pick_event

时间:2015-03-05 19:16:19

标签: python numpy matplotlib

我一直在努力创建一个交互式绘图选择器,我有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:如果有关于此的上一个主题,我道歉。如果有我的话,我还没有找到任何东西!

1 个答案:

答案 0 :(得分:0)

您可以使用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