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

