我正在尝试访问条形图右上角显示的 Y 值文本。 我可以得到坐标,但不能得到文本。 我的目标是通过单击条形图获取文本,然后调用另一个绘图或显示包含详细信息的数据框(向下钻取)。 我愿意接受建议,包括使用其他库,例如plotly。
import matplotlib.pyplot as plt
import plotly.graph_objects as go
import pandas as pd
import numpy as np
import mplcursors
def addlabels(x,y):
for i in range(len(x)):
plt.text(i, y[i]//2,y[i], ha = 'center')
df = pd.read_csv(r'C:\Users\XXXXX\OneDrive\TOP20.csv', usecols=['Name', 'MaxRAM'])
df2 = df
name_list = df2['Name'].tolist()
maxram_list = df2['MaxRAM'].tolist()
fig = go.Figure(data=[go.Bar(x=name_list, y=maxram_list)])
fig, ax = plt.subplots()
bars = ax.barh(name_list, maxram_list)
ax.bar_label(bars)
def on_hover(sel):
x_val = sel.target[0]
y_val = sel.target[1]
sel.annotation.set_text(f'x: {x_val:.2f}, y: {y_val:.2f}')
cursor = mplcursors.cursor(bars, hover=True)
cursor.connect("add", on_hover)
def on_click(event):
if event.inaxes == ax:
for bar in bars:
if bar.contains(event)[0]:
x_coords = np.arange(len(name_list))
x_val = bar.get_x() + bar.get_width() / 2
y_val = bar.get_height()
label = bar.get_label()
print(f'Clicked bar: {label}, Value: {y_val}')
fig.canvas.mpl_connect('button_press_event', on_click)
plt.show()
单击栏时的输出: 单击的栏:nolegend,值:0.8
尝试了各种方法来访问 Y 坐标的文本。
您获得
_nolegend_
而不是实际标签的原因是您尚未为条形图设置标签。
您可以使用
bar.set_label()
方法来完成此操作,如下所示:
for bar in bars:
i = bars.index(bar)
bar.set_label(name_list[i])
完成后,您将能够使用
get_label()
方法获取标签。要显示另一个具有单击栏的向下钻取视图的图,您可以修改现有的 on_click()
函数,如下所示:
def on_click(event):
if event.inaxes == ax:
for bar in bars:
if bar.contains(event)[0]:
name = bar.get_label()
maxram = bar.get_height()
fig2, ax2 = plt.subplots()
ax2.set_title(f'Drilldown for {name}')
ax2.text(0.5, 0.5, f'Clicked Bar: {name}\nValue: {maxram}GB',
transform=ax2.transAxes, ha='center', fontsize=12, color='blue')
ax2.axis('off')
plt.show()
break
这应该可以帮助您实现您所需要的。另外,正如 @JohanC 在评论中提到的,请删除对
plotly
的任何引用,因为这是一个非常不同的库,您的目标可以单独使用 matplotlib
和 mplcursors
来实现。
(注意:您还可以使用
enumerate()
函数来简化用于设置标签的for循环。)