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

