如何让堆叠柱状图与折线图中同名数据系列颜色一致?
实现堆叠柱状图与折线图同名数据系列颜色一致
核心思路是为两个DataFrame中所有出现的数据系列(列名并集)分配唯一颜色,绘图时直接复用这个颜色映射,确保同名系列调用相同颜色。
修正代码及关键点说明
# 提取两个DataFrame的所有列名并集,确保每个系列都有对应颜色 cols = df_Plot.columns.union(df_Plot1.columns) # 用Set1配色方案为每个系列绑定唯一颜色 cmap = matplotlib.colormaps['Set1'] colors = {col: cmap(i) for i, col in enumerate(cols)} # 绘制堆叠柱状图:直接传入颜色字典,plot会自动匹配对应系列的颜色 df_Plot.iloc[0:plotFinish].plot.bar( ax=ax1, color=colors, # 用颜色字典替代原列表映射,避免顺序问题 rot=45, legend=True, xlabel='Date', ylabel='Actuals', alpha=0.5, stacked=True ) # 绘制折线图:复用同一颜色字典,同名系列自动使用相同颜色 df_Plot1.iloc[0:plotFinish].plot.line( ax=ax2, color=colors, ylabel='Allocation', legend=True, linewidth=3 ) # 保留原有图例设置 ax1.legend(title='Actuals', bbox_to_anchor=(1.05,1.0), loc='upper left', ncol=1) ax2.legend(title='Allocations', bbox_to_anchor=(1.05,0.5), loc='upper left', ncol=1) fig.suptitle(employee)
关键优化点
- 颜色映射更可靠:用字典直接绑定系列名与颜色,替代原有的列名map生成列表的方式,彻底避免因列顺序变化导致的颜色不匹配。
- 简化冗余操作:原代码中的
reindex(columns=cols)可以去掉,plot方法会自动忽略DataFrame中不存在的系列,颜色字典里多余的键不会影响绘图。 - 配色扩展性:如果数据系列数量超过Set1的颜色数(共9种),可以换用
tab20这类颜色更多的配色方案,或者循环复用颜色:# 循环使用Set1颜色的示例 colors = {col: cmap(i % len(cmap.colors)) for i, col in enumerate(cols)}
额外提示
注意两个DataFrame的x轴对齐问题:df#1的x轴是具体日期,df#2是月份,若需要折线与柱状图在时间上严格对齐,可将df#2的月份转换为对应月份的日期(比如每月第一天),确保x轴数据类型一致。
内容的提问来源于stack exchange,提问作者Jim Rutter
相关产品推荐
相关产品推荐

