读取条形图右上角显示的 X 轴值文本

问题描述 投票:0回答:1

我正在尝试访问条形图右上角显示的 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

enter image description here

尝试了各种方法来访问 Y 坐标的文本。

python matplotlib plotly
1个回答
0
投票

您获得

_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循环。)

© www.soinside.com 2019 - 2024. All rights reserved.