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

如何在pandas水平条形图末端显示所有数值(含小数值)

解决pandas水平条形图末端小数值无法显示的问题

我之前也碰到过一模一样的情况——用pd.value_counts()直接生成的水平条形图,小数值经常因为条形太短被“藏”起来,根本看不到。其实不用纠结有没有明确的X/Y轴数据,我们可以直接操作pandas绘图后生成的条形元素,给每个条形都加上数值标注就行。

给你修改好的可直接运行的代码:

import matplotlib.pyplot as plt
import pandas as pd

fig = plt.figure(figsize=(20,15)) 

# 处理第一个子图
axis1 = fig.add_subplot(211) 
axis1.set_title("Title name") 
# 先统计数据,再指定ax参数绑定到子图,不用多余的赋值操作
counts1 = pd.value_counts(df['column5']).sort_values()
counts1.plot(kind='barh', ax=axis1)
# 遍历每个条形添加数值标注
for bar in axis1.patches:
    # 获取条形宽度(也就是统计的数值大小)
    bar_width = bar.get_width()
    # 计算文本垂直居中的Y坐标,让标注看起来更整齐
    y_center = bar.get_y() + bar.get_height() / 2
    # 在条形末端添加文本,左对齐确保小数值也能完整显示
    axis1.text(bar_width, y_center, f'{bar_width:.2f}', ha='left', va='center')

# 处理第二个子图,逻辑和第一个完全一致
axis2 = fig.add_subplot(212) 
axis2.set_title("Title name2") 
counts2 = pd.value_counts(df['column6']).sort_values()
counts2.plot(kind='barh', ax=axis2)
for bar in axis2.patches:
    bar_width = bar.get_width()
    y_center = bar.get_y() + bar.get_height() / 2
    axis2.text(bar_width, y_center, f'{bar_width:.2f}', ha='left', va='center')

# 自动调整布局,避免标题和图表重叠挤在一起
fig.tight_layout()
fig.savefig('report.pdf')

几个关键细节补充:

  • 别把plot()的结果赋值给axis1.plot,这是完全多余的操作,直接用ax参数把绘图绑定到指定子图轴上就好
  • axis.patches会返回所有条形的元素集合,我们可以逐个遍历处理每个条形
  • 如果你不需要保留两位小数,可以把f'{bar_width:.2f}'改成f'{bar_width}'显示整数,或者调整成你需要的小数位数
  • fig.tight_layout()能自动优化子图间距,让整体排版更舒服,不会出现标题压到图表的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:28:35