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

Python堆叠柱状图实现:如何按年份列堆叠展示全年日期数据?

问题分析
  • 分组逻辑错误:你写的groupby([data['Year']=='2019']['Day'])是错误写法,无法实现“筛选对应年份数据后按Day分组”的需求,会导致分组键异常引发报错。
  • 未配置堆叠参数:连续调用两次bar函数只会让柱状图重叠,而非堆叠,必须通过bottom参数指定上层柱状图的底部为下层的高度。
  • 数据未对齐:如果某年份部分日期没有数据,分组后会丢失这些日期,导致两个年份的Day序列不匹配,绘制时x轴会出现错位。
解决代码

方法1:筛选年份+补全缺失日期(手动控制堆叠)

import pandas as pd
import matplotlib.pyplot as plt

# 正确筛选年份后按Day分组统计
b2020 = data[data['Year'] == 2020].groupby(['Day'], as_index=False, sort=False).agg(Count=('Day', 'size'))
b2019 = data[data['Year'] == 2019].groupby(['Day'], as_index=False, sort=False).agg(Count=('Day', 'size'))

# 生成1-365天的完整序列,补全缺失日期的Count为0
all_days = pd.DataFrame({'Day': range(1, 366)})
b2020 = all_days.merge(b2020, on='Day', how='left').fillna(0)
b2019 = all_days.merge(b2019, on='Day', how='left').fillna(0)

plt.figure(figsize=(20,4))
# 先绘制2020年数据作为底层(蓝色)
plt.bar(x=b2020['Day'], height=b2020['Count'], color='b', label='2020')
# 绘制2019年数据,bottom参数指定以2020的数值为底部,实现堆叠(红色)
plt.bar(x=b2019['Day'], height=b2019['Count'], color='r', bottom=b2020['Count'], label='2019')

plt.xlabel('Day of Year')
plt.ylabel('Count')
plt.legend()
plt.show()

方法2:分组转宽格式(更简洁的堆叠实现)

import pandas as pd
import matplotlib.pyplot as plt

# 按Year和Day分组统计,转成宽格式(列对应年份,行对应日期)
day_year_count = data.groupby(['Year', 'Day'], as_index=False).agg(Count=('Day', 'size')).pivot(index='Day', columns='Year', values='Count').fillna(0)
# 确保覆盖全年1-365天,缺失日期补0
day_year_count = day_year_count.reindex(range(1, 366), fill_value=0)

plt.figure(figsize=(20,4))
# 直接绘制堆叠柱状图,指定对应颜色
day_year_count.plot(kind='bar', stacked=True, color={'2020':'b', '2019':'r'}, ax=plt.gca())

plt.xlabel('Day of Year')
plt.ylabel('Count')
plt.legend(title='Year')
plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 17:05:51