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

Matplotlib stackplot如何为分组指定跨子图一致的固定颜色

Matplotlib多子图堆积面积图同分组固定颜色实现方案

核心逻辑:放弃依赖matplotlib按传入顺序自动循环取色的默认机制,提前建立全局的「分组名称-固定颜色」映射表,每次绘图时手动指定当前子图所有分组对应的颜色,从根源上避免顺序取色导致的同组异色问题。

你对colormap方案的判断是正确的:无论是默认色图还是自定义色图,本质都是按绘图时传入的序列顺序循环取色,只要不同子图的分组数量、传入顺序不一致,就无法保证跨子图的颜色一致性,和选用哪种色图没有关系。

具体实现步骤

  • 提前枚举所有绘图场景中会出现的全部分组,为每个分组分配唯一的专属颜色,构建全局映射字典。分组数量较多时,可以直接调用matplotlib自带的离散色卡(如tab10、tab20、tab20b)取色,避免手动选色出现冲突。
  • 每次调用stackplot绘图前,根据当前子图传入的分组标签顺序,从全局映射字典中取出对应颜色组成颜色列表,传给stackplot的colors参数即可。

修正后的可运行示例代码

import matplotlib.pyplot as plt

# 测试数据
a = [1, 3, 5]
b = [3, 4, 5]
c = [4, 5, 6]
d = [6, 7, 8]
x = [0, 1, 2]

# 核心:定义全局分组-颜色固定映射
# 取matplotlib默认离散色板的颜色,也可以替换为自定义十六进制颜色值
default_colors = plt.rcParams['axes.prop_cycle'].by_key()['color']
group_color_map = {
    'a': default_colors[0],
    'b': default_colors[1],
    'c': default_colors[2],
    'd': default_colors[3]
    # 后续新增分组直接在此处追加映射关系即可
}

fig, axs = plt.subplots(1, 2, figsize=(20, 7), sharex=True, sharey=True)

# 绘制第一个子图(分组a、b、c)
labels_0 = ['a', 'b', 'c']
colors_0 = [group_color_map[g] for g in labels_0]
axs[0].stackplot(x, a, b, c, labels=labels_0, colors=colors_0)
axs[0].legend()

# 绘制第二个子图(分组c、d)
labels_1 = ['c', 'd']
colors_1 = [group_color_map[g] for g in labels_1]
axs[1].stackplot(x, c, d, labels=labels_1, colors=colors_1)
axs[1].legend()

plt.show()

方案扩展性说明

该方案无数量限制,可支持任意多子图、任意分组组合的场景。无论分组在子图中的传入顺序如何、每个子图包含多少个分组,只要全局映射表中定义了对应分组的颜色,就能保证同一分组在所有子图中的显示颜色完全一致。新增分组时仅需更新全局映射字典,无需修改已有绘图逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:21:30