#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
и сначала проверить, действительно ли щелчок был внутри одного из прямоугольников.