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

如何在Pandas分组柱状图的每个柱条上正确显示数值?

解决柱状图柱条上方数值标注的问题

我来帮你搞定这个柱条数值位置错误的问题~你的核心问题是没有正确对应柱状图中每个柱条的坐标位置,而且文本标注的参数顺序也搞反了。

问题分析

你原来的代码里,enumerate(df.groupby(["Destiny","Year"])["Flight"].count())遍历的是一个一维Series,得到的i是0到4的序号,v是统计的数值,但这和柱状图里的柱条位置完全不匹配——因为unstack()之后的柱状图,每个Destiny对应多个Year的柱,x轴的位置是分组后的类别,不是一维的序号。另外a.text(v, i, str(v))的参数顺序是错的,Matplotlib的text方法是先传x坐标,再传y坐标,最后是文本内容。

正确的解决方案

我们可以直接获取柱状图的所有柱条对象,然后逐个获取它们的位置和高度,再把数值标注在柱条顶部的居中位置:

import pandas as pd
import matplotlib.pyplot as plt

# 你的原始DataFrame
df = pd.DataFrame({
    "Day": [10,10,10,10,10],
    "Destiny": ["AJU","AJU","FOR","FOR","FOR"],
    "Flight": [1504,1502,1524,1522,1528],
    "Year": [2019,2020,2019,2020,2019]
})

# 1. 先计算统计数据,避免重复计算
flight_counts = df.groupby(["Destiny","Year"])["Flight"].count().unstack()

# 2. 绘制柱状图并获取轴对象
ax = flight_counts.plot.bar(figsize=(12, 3))

# 3. 遍历每个柱条,添加数值标注
for patch in ax.patches:
    # 获取柱条的高度(即统计的数值)
    height = patch.get_height()
    # 计算文本的x坐标:柱条左边缘 + 宽度/2(居中)
    x = patch.get_x() + patch.get_width() / 2
    # 计算文本的y坐标:柱条顶部(可以加个小偏移避免贴太紧)
    y = height + 0.05
    # 添加文本,水平居中
    ax.text(x, y, str(height), ha='center', va='bottom')

plt.show()

代码解释

  • ax.patches:返回柱状图中所有的柱条对象,每个对象包含位置、宽度、高度等属性
  • patch.get_x() + patch.get_width()/2:确保文本在柱条的水平中心位置
  • ha='center':设置文本水平居中,va='bottom':设置文本垂直对齐在底部(刚好在柱条顶部上方)
  • 加0.05的偏移是为了让数值和柱条顶部之间有一点空隙,看起来更美观

这样运行后,每个柱条的顶部都会准确显示对应的统计数值啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 18:18:12