Может ли Matplotlib возвращать метку панели с помощью события щелчка мыши?

#python #matplotlib

#python #matplotlib

Вопрос:

Я пытаюсь заставить гистограмму возвращать метку панели при нажатии, но я не могу найти пример, где эта конкретная задача была выполнена на гистограмме. Я нашел этот образец гистограммы из Matplotlib, но в нем нет никаких настроенных событий:

 import matplotlib.pyplot as plt
import numpy as np


labels = ['G1', 'G2', 'G3', 'G4', 'G5']
men_means = [20, 34, 30, 35, 27]
women_means = [25, 32, 34, 20, 25]

x = np.arange(len(labels))  # the label locations
width = 0.35  # the width of the bars

fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, men_means, width, label='Men')
rects2 = ax.bar(x   width/2, women_means, width, label='Women')

# Add some text for labels, title and custom x-axis tick labels, etc.
ax.set_ylabel('Scores')
ax.set_title('Scores by group and gender')
ax.set_xticks(x, labels)
ax.legend()

ax.bar_label(rects1, padding=3)
ax.bar_label(rects2, padding=3)

fig.tight_layout()

plt.show()
 

Ответ №1:

Сначала вам нужно добавить обработку событий к рисунку. Вы можете сделать это с помощью

 fig.canvas.mpl_connect('button_press_event', onclick)
 

Это говорит matplotlib запускать функцию onclick всякий раз, когда вы нажимаете на свою фигуру. onclick должна иметь подпись

 def onclick(event):
 

и вы можете получить доступ, например, к координате x нажатия мыши с помощью event.xdata . В вашем случае, если вы всегда рисуете столбцы в каждой целочисленной позиции на оси x, вы можете преобразовать координату x нажатия в ближайшее целое число и получить доступ к этому элементу ваших меток. Вы можете получить индекс для этого элемента как

 idx = int(event.xdata.round())
 

Наконец, event.inaxes возвращает вам экземпляр оси, на который вы нажали, чтобы вы могли получить доступ к меткам оси lbls = event.inaxes.get_xticklabels() . Затем вы можете записать onclick как

 def onclick(event):
    ax = event.inaxes
    x = event.xdata
    lbls = ax.get_xticklabels()
    idx = int(x.round())
    lbl = lbls[idx]
    print(lbl.get_text())
 

чтобы напечатать метку ближайшего бара. Однако этот код все равно будет печатать что-то, если вы нажмете между столбцами. Если вы хотите убедиться, что вы нажимаете на панель, вы можете получить прямоугольники, используемые для построения гистограммы, ax.patches и сначала проверить, действительно ли щелчок был внутри одного из прямоугольников.