如何使用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()
代码解析
数据排序修正:
原代码仅单独排序Qty,但Hospital仍保持原顺序,会导致条形与医院名称不匹配。修改为对整个DataFrame按Qty排序,确保医院和献血量的对应关系正确。保存条形对象:
将mplt.barh()的返回值赋值给bars,每个bar对象对应一个水平条形,方便后续获取其位置和宽度参数。添加数值标签的核心循环:
bar.get_width():获取当前条形的宽度,也就是对应的献血量数值。bar.get_y() + bar.get_height()/2:计算条形在y轴方向的中心坐标,让标签垂直居中显示。mplt.text():在指定位置绘制文本标签,ha='left'让文本左对齐(紧贴条形右侧),va='center'保证垂直居中,fontsize控制标签字体大小。
调整x轴范围:
使用mplt.xlim()将x轴最大范围设置为最大献血量的1.1倍,避免数值标签超出图表边界。
内容的提问来源于stack exchange,提问作者Thakshaya
相关产品推荐
相关产品推荐

