Python Обработка событий Matplotlib из действий мыши и клавиатуры - PullRequest
0 голосов
/ 08 июля 2020

Мне сложно найти лучший способ сделать интерактивный график временных рядов. Моя конечная цель - дважды извлечь из графика и вернуть эти два значения для дальнейшего расчета. У меня есть график временного ряда, который мне нужно увеличить, чтобы получить как можно более точное время выборки. Затем я хочу иметь возможность ударить по клавиатуре с помощью 1 , 2 или q (если я закончил выбор и хочу выйти из сюжета и возвращаемые значения). После того, как я нажму 1 или 2 , я хочу иметь возможность «щелкнуть правой кнопкой мыши» место графика, где я хочу выбрать время (event.xdata), которое отображается сигнал интереса. После выбора 1 или 2 раз на графике (я также хочу быть достаточно надежным, чтобы иметь возможность перебивать 1 или 2 выберите, если первый плохой), я хочу иметь возможность нажать кнопку [Qq], чтобы закрыть сам график и вернуть эти два значения в мой основной код для сохранения в кадре данных pandas. Следующий код - это то, что у меня есть до сих пор, но я знаю, что мой logi c где-то неверен, потому что, когда я нажимаю Q / q , график не закрывается, и я не делаю этого. Я возвращаю свои значения pk1 и pk2 к моему основному коду. Я пытался понять все это, используя страницу https://matplotlib.org/3.2.1/users/event_handling.html для обработки событий как для нажатий на клавиатуре, так и для щелчков мышью, но я не могу понять, что происходит. Также отмечу, что при попытке нажать ctrl + s появляется окно GUI для сохранения фигуры. Я не знаю, есть ли у меня конфликтующие сочетания клавиш, но это тоже проблема. Будем очень признательны за любые рекомендации или помощь в выполнении этой работы.

    def OnKey(event):
        print("\n    --- Right click to select 1 or 2 location ---\n")
        global pk1, pk2
        if event.key == "ctrl+p":
            print('You selected picking 1 operation')
            tpk = []
            if len(tpk) < 1:
                # call the mouse picking event function for 1nd pick
                cid = fig.canvas.mpl_connect('button_press_event', OnClick)
                pk1 = tpk
        elif event.key == "ctrl+s":
            print('You selected picking 2 operation')
            tpk = []
            if len(tpk) < 1:
                # call the mouse picking event function for 2nd pick
                cid = fig.canvas.mpl_connect('button_press_event', OnClick)
                pk2 = tpk
        elif event.key== "ctrl+q":
            fig.canvas.mpl_disconnect(cid)
            plt.close()
        else:
            print('No picking operation selected. \n\tPlease press __ctrl+p__ or __ctrl+s__ key to select from plot\n\tPress Q to quit plot')
        return pk1, pk2

    def OnClick(event):
        if event.dblclick:
            print("DBLCLICK")
            # pass
        elif event.button == 3:  # 3 == right click
            tpk = event.xdata
            keepit = input("    Keep it? {1|0}  ")
            if keepit == 0:
                tpk = 0
            else:
                tpk = UTCDateTime(tpk)   # this is a function to take time stamp to UTC time
            print('    Phase Pick: ', tpk)
        return tpk

    pk1 = []; pk2= []
    # call click function
    cid = fig.canvas.mpl_connect('button_press_event', OnKey)

    print("\n    --- Press Ctrl+p -- Ctrl+s to pick 1 or 2 phase ---\n")

    plt.show()

    return pk1, pk2```
...