如何在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
相关产品推荐
相关产品推荐

