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

