Matplotlib 可以使用鼠标点击事件返回柱线的标签吗?



我试图让条形图在单击时返回条形图的标签,但我找不到在条形图上完成此特定任务的示例。我在Matplotlib中找到了这个示例barchart,但它没有设置任何事件:

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()

首先,您需要将事件处理添加到图中

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

这个命令告诉matplotlib每当您点击您的图形时运行函数onclickonclick应该有签名

def onclick(event):

并且您可以使用event.xdata访问例如鼠标按压的x坐标。在您的情况下,如果您总是在x轴上的每个整数位置绘制条形图,则可以将印刷机的x坐标转换为最接近的整数,并访问标签的元素。您可以获得该元素的索引作为

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

最后,event.inaxes会为您获取已单击的Axis实例,因此您可以使用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绘制条形图的矩形,并首先检查点击是否真的在其中一个矩形内。

最新更新