Как различить правую и левую кнопки в SpanSelector? - PullRequest
2 голосов
/ 05 апреля 2019

Я хочу использовать SpanSelector, чтобы выбрать два интервала на графике. Чтобы сохранить различные экстремумы интервалов, я хотел бы использовать флаг в зависимости от того, выбрал ли я интервал, используя правую или левую кнопку (чтобы я мог различить два требуемых интервала).

Возможно ли вышеуказанное?


Отредактировано:

Если быть более точным: я хотел бы, чтобы после отображения графика SpanSelector рисовал красный диапазон области, если он был сделан левой кнопкой, и синий интервал области, если выполнялся правой кнопкой.


Пример:

Приведенный ниже код позволяет пользователю в интерактивном режиме выбрать интервал, а затем распечатать этот интервал

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.widgets as mwidgets  

fig = plt.figure() 
ax = plt.axes() 
x = np.arange(0,2*np.pi)  
y = np.sin(x) 
ax.plot(x,y) 

def onselect(vmin, vmax):
    print(vmin, vmax)

span = mwidgets.SpanSelector(ax, onselect, 'horizontal') 

plt.show()                                                               

Я хотел бы изменить приведенный выше код так, чтобы, если интервал рисуется левой кнопкой, он печатал "LEFT: vimin, vmax", а если интервал рисуется правой кнопкой, он печатал "RIGHT: vmin, vmax".

Возможно ли вышеизложенное?

Ответы [ 2 ]

1 голос
/ 06 апреля 2019
SpanSelector(..., button=1)

будет селектором диапазона для левой кнопки мыши, а

SpanSelector(..., button=3)

будет переключателем диапазона для правой кнопки мыши.

0 голосов
/ 07 апреля 2019

Я решил, используя mpl_connect.Я не делал различий между левым и правым щелчком, но сделал так, чтобы код обрабатывал ввод SpanSelector по-разному, в зависимости от того, предшествовал ли выделенный мышью интервал нажатием клавиши enter или нажатием клавиши shift+enter.Я оставляю код ниже на случай, если он пригодится кому-то еще.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.widgets as mwidgets  

fig = plt.figure() 
ax = plt.axes() 
x = np.arange(0,2*np.pi)  
y = np.sin(x) 
ax.plot(x,y) 
ax.set_title('[Press \'enter\' and \'shift+enter\' to select the intervals]')

def onselect(vmin, vmax):
    if plot_key_input == 'enter':
        print('Interval type 1:', vmin, vmax)
    if plot_key_input == 'enter+shift':
        print('Interval type 2:', vmin, vmax)

# The variable plot_key_input will store the key that is pressed during the plot visualization
plot_key_input = None
# Get the key pressed during the plot visualization
def onPressKey(event):
# Defined as a global variable so it will affect other programs and functions
    global plot_key_input
    plot_key_input = event.key

# Connect the keys to the function onPressKey during the plot visualization
cid = fig.canvas.mpl_connect('key_press_event', onPressKey)

span = mwidgets.SpanSelector(ax, onselect, 'horizontal') 

plt.show() 

# Disconnect the keys to the function onPressKey
fig.canvas.mpl_disconnect(cid)
...