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

如何使用pandas绘制无重复颜色的堆叠(复合)柱状图?

堆叠柱状图(复合柱状图)生成及颜色重复问题解决方案

pandas内置的柱状图接口原生支持堆叠模式,你代码中用stacked=True的写法本身没有问题,颜色重复是因为默认配色循环的颜色数量少于你数据里的州/地区(State/UTs)总数,配色循环用完之后就会复用之前的颜色,导致不同州颜色撞色。

修复方案

你只需要在绘图前给每个州/地区分配唯一固定的配色,再传入绘图接口即可,修改后的绘图部分代码如下:

import matplotlib.cm as cm
import numpy as np

# 先获取所有州的唯一值
states = data2['State/UTs'].unique()
n_states = len(states)

# 生成足够多的唯一配色,州数量少于20用tab20,超过的话可以拼接多个配色盘
if n_states <= 20:
    color_palette = cm.get_cmap('tab20', n_states).colors
else:
    # 超过20个州的话拼接tab20和tab20b两个配色盘,最多支持40种颜色
    cmap1 = cm.get_cmap('tab20', 20)
    cmap2 = cm.get_cmap('tab20b', 20)
    color_palette = np.vstack((cmap1.colors, cmap2.colors))[:n_states]

# 建立州和颜色的对应映射,保证每个州颜色固定
color_map = dict(zip(states, color_palette))

# 绘图时传入color参数
pivot_df = data2.pivot_table(index='Level', columns = 'State/UTs', values = 'Total Cases')
ax = pivot_df.plot(kind='bar', stacked=True, figsize=(15,15), fontsize=25, color=[color_map[col] for col in pivot_df.columns])

# 后续的样式调整代码保持不变即可
plt.grid()
ax.axhline(0, color='black', lw=1)
ax.legend(fontsize=8, loc=(1.0,0.2))
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.spines['bottom'].set_linewidth(3)
ax.spines['left'].set_linewidth(3)
ax.set_xlabel('Level',fontsize=20,color='r')
ax.set_ylabel('Total Cases',fontsize=20,color='r')
plt.xticks(rotation=0)
plt.show()

效果说明

  • 修复后每个州/地区都会对应唯一的颜色,不会再出现颜色重复混淆的问题
  • 配色映射是固定的,即使后续数据里州的顺序变化,同一个州的颜色也不会变,便于跨图表对比

效果参考

目标效果

目标效果图

原始错误效果

实际输出效果图

修复后参考效果

更新后效果图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:15:03