You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Matplotlib为水平条形图添加右侧数值标签及代码解析

为Matplotlib水平条形图添加右侧数值标签(附代码解析)

需求

作为编程新手,希望给Matplotlib绘制的水平条形图每个条形的右侧添加对应的数值标签,以下是相关数据、原代码及效果对比:

使用的DataFrame数据

BG_donated   Qty                            Hospital   Location    Contact
0          A-    25               Badr Al Sama Hospital      Sohar   43445995
1          A+    64                     Aster Al Raffah      Saham   58939595
2          B+    41                       Ibri Hospital       Ibri   74823847
3          B-    35                     Apollo Hospital   Hamriyah   63947392
4          O-    51   Sultan Qaboos University Hospital       Seeb   95821774
5          O+    30     Al Hayat International Hospital  Al Ghubra   44721402
6         AB-    46                  KIMS Oman Hospital    Darsait   37190481
7         AB+    41   NMC Healthcare Specialty Hospital       Ruwi   92810482

原绘图代码

import matplotlib as mplt
# 假设df3是已加载好的DataFrame
y = df3['Qty'].sort_values()
w = df3['Hospital']
c = ['coral', 'salmon', 'indianred', 'brown', 'crimson', 'aquamarine',  
     'lightseagreen', 'slategray']
mplt.title('Analysis Report I',size = 30)
mplt.xlabel('Amount of Blood Donated',size = 15)
mplt.ylabel('Hospitals',size = 15)
mplt.barh(w,y,color = c)
mplt.show()

效果对比

  • 当前输出:无右侧数值标签的水平条形图
  • 期望效果:每个条形右侧显示对应献血量数值的水平条形图

修改后的完整代码

import matplotlib as mplt
# 确保df3已正确加载
# 修正原代码的排序问题:对整个DataFrame按Qty排序,保证医院和献血量对应关系正确
sorted_df = df3.sort_values('Qty')
y = sorted_df['Qty']
w = sorted_df['Hospital']
c = ['coral', 'salmon', 'indianred', 'brown', 'crimson', 'aquamarine',  
     'lightseagreen', 'slategray']

mplt.title('分析报告I',size = 30)
mplt.xlabel('献血量',size = 15)
mplt.ylabel('医院',size = 15)
# 保存条形对象,方便后续添加标签
bars = mplt.barh(w,y,color = c)

# 核心逻辑:给每个条形添加右侧数值标签
for bar in bars:
    # 获取当前条形的宽度(即对应献血量数值)
    width = bar.get_width()
    # 计算条形在y轴方向的中心位置,让标签垂直居中
    y_pos = bar.get_y() + bar.get_height()/2
    # 在条形右侧绘制数值标签,设置对齐方式和字体大小
    mplt.text(width, y_pos, f'{int(width)}', ha='left', va='center', fontsize=12)

# 扩展x轴范围,避免数值标签超出图表显示区域
mplt.xlim(0, max(y)*1.1)

mplt.show()

代码解析

  1. 数据排序修正:
    原代码仅单独排序Qty,但Hospital仍保持原顺序,会导致条形与医院名称不匹配。修改为对整个DataFrame按Qty排序,确保医院和献血量的对应关系正确。

  2. 保存条形对象:
    将mplt.barh()的返回值赋值给bars,每个bar对象对应一个水平条形,方便后续获取其位置和宽度参数。

  3. 添加数值标签的核心循环:

    • bar.get_width():获取当前条形的宽度,也就是对应的献血量数值。
    • bar.get_y() + bar.get_height()/2:计算条形在y轴方向的中心坐标,让标签垂直居中显示。
    • mplt.text():在指定位置绘制文本标签,ha='left'让文本左对齐(紧贴条形右侧),va='center'保证垂直居中,fontsize控制标签字体大小。
  4. 调整x轴范围:
    使用mplt.xlim()将x轴最大范围设置为最大献血量的1.1倍,避免数值标签超出图表边界。

内容的提问来源于stack exchange,提问作者Thakshaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:05:49