如何用Pandas基于同列堆叠分类的时间序列数据绘制堆叠柱状图
实现按日期分组、传感器名称堆叠的柱状图
你的原始DataFrame结构如下:
TrgID SenName SignalToNoise date 0 20201001000732016 a 1.645613 2020-10-01 1 20201001000732016 b 2.601088 2020-10-01 2 20201001000732016 c 1.253404 2020-10-01 3 20201001000732017 a 6.062578 2020-10-01 4 20201001000732017 b 2.753620 2020-10-01 5 20201001000732017 c 3.671336 2020-10-01 6 20201001000732018 a 1.466516 2020-10-01 7 20201001000732018 b 1.232844 2020-10-01 8 20201001000732018 c 2.028571 2020-10-01 9 20210331234440962 a 11.182038 2020-10-02 10 20210331234440962 b 11.413975 2020-10-02 11 20210331234440962 c 14.690728 2020-10-02 12 20210331234440963 a 1.228948 2020-10-02 13 20210331234440963 b 1.105445 2020-10-02 14 20210331234440963 c 2.035442 2020-10-02 15 20210331234440964 a 2.453167 2020-10-02 16 20210331234440964 b 2.075166 2020-10-02 17 20210331234440964 c 1.140017 2020-10-02
当前代码直接绘制会生成每个行数据的独立柱子,原因是你的数据是长格式(单数值列),而pandas堆叠柱状图需要宽格式(每个类别对应一列)。解决步骤如下:
1. 数据重塑:汇总并转成宽格式
先按date和SenName分组,对SignalToNoise求和,再将SenName转为列:
# 方法1:groupby + unstack df_grouped = df.groupby(['date', 'SenName'])['SignalToNoise'].sum().unstack() # 方法2:pivot_table(功能更灵活) df_grouped = df.pivot_table(index='date', columns='SenName', values='SignalToNoise', aggfunc='sum')
处理后的数据格式会变成:
SenName a b c date 2020-10-01 9.174707 6.587552 6.953311 2020-10-02 14.864153 14.594586 17.866187
2. 绘制堆叠柱状图
调用plot.bar并设置stacked=True参数:
ax = df_grouped.plot.bar(stacked=True, figsize=(8, 6)) # 可选:添加标题和标签 ax.set_title('SignalToNoise by Date (Stacked by Sensor)') ax.set_xlabel('Date') ax.set_ylabel('Total SignalToNoise')
这样就能得到x轴为日期,y轴按传感器名称堆叠的柱状图,每个日期下的柱子由a/b/c三类传感器的数值堆叠而成。
内容的提问来源于stack exchange,提问作者Spooked
相关产品推荐
相关产品推荐

