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

移除DataFrame列后matplotlib colormap为何出现颜色随机缺失?

为什么移除列后Colormap颜色会变化?

根本原因是Matplotlib+Pandas的颜色分配逻辑并非固定绑定类别,而是按当前绘制的系列数量动态从色板取色:

  • Set3色板本身有12种固定顺序的颜色,但Pandas绘制堆叠图时,会根据当前要绘制的系列总数,从色板开头按顺序截取对应数量的颜色,不会固定将某个类别与特定颜色绑定。
  • 你移除列8后,右侧df_prob的系列数从9个(0-8)变为8个(0-7),此时右侧取色范围从Set3前9种缩小为前8种。左侧df_target虽然仍为8个系列,但由于右侧取色逻辑改变,加上左侧部分color_groups在某些分组中无数据(比如color_groups 3仅在B组有数据),原本显示的粉色、紫色这类偏后的色板颜色,要么被排除在取色范围外,要么因对应系列无数据而不显示,看起来就像被“随机移除”了。
怎么固定颜色?

如果想让特定类别/列绑定固定颜色,不要依赖自动取色,手动创建颜色映射字典即可:

import matplotlib.pyplot as plt

# 取出Set3色板的所有颜色
set3_colors = plt.cm.Set3.colors

# 为color_groups和数值列分别绑定固定颜色
color_map = {}
# color_groups 1-8对应Set3前8种颜色
for idx, cg in enumerate([1,2,3,4,5,6,7,8]):
    color_map[cg] = set3_colors[idx]
# 数值列0-7对应相同的Set3前8种颜色(与color_groups一一匹配)
for idx, col in enumerate(range(8)):
    color_map[col] = set3_colors[idx]

# 绘图时指定自定义颜色列表
df_target.plot(kind='bar', stacked=True, position=1, 
               color=[color_map[cg] for cg in df_target.columns],
               width=0.4, ax=ax, edgecolor='grey')
df_prob.plot.bar(stacked=True, ax=ax, position=0,
                 color=[color_map[col] for col in df_prob.columns],
                 width=0.4, legend=False, alpha=0.6, edgecolor='grey')

这样无论是否删除列,每个类别对应的颜色都不会改变。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:10:04