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

如何固定Matplotlib图例顺序与曲线颜色?

固定Matplotlib图例顺序与曲线颜色的解决方案

问题根源

你碰到的问题核心在于**kwargs的遍历逻辑——Python 3.7之前的字典是无序的,即便3.7+开始字典保留插入顺序,依赖这个特性来控制图例顺序也不够稳妥。加上Matplotlib默认会按绘图顺序自动分配颜色,一旦遍历顺序变动,颜色和图例的对应关系也会乱掉。

解决思路

我们可以从两个维度彻底解决这个问题:

  • 主动指定系列显示顺序:不再直接遍历kwargs,而是定义一个明确的列表来指定要显示的系列及其顺序,完全掌控图例的排列。
  • 给每个系列绑定固定颜色:创建颜色映射字典,让每个系列名称对应固定的颜色,确保每次绘图颜色都和图例精准匹配。

修改后的代码

import numpy as np
import matplotlib.pyplot as plt

def plot_with_fixed_list(n, series_order=None, color_map=None, **kwargs):
    np.random.seed(0)
    fig, ax1 = plt.subplots()
    my_handles = []
    
    # 默认顺序:未指定时用kwargs插入顺序(3.7+有效),否则用用户指定顺序
    if series_order is None:
        series_order = list(kwargs.keys())
    # 默认颜色映射:给每个系列分配固定颜色,可按需修改
    if color_map is None:
        color_map = {
            'FA_Hybrid': '#1f77b4',  # 标准蓝色
            'BP': '#ff7f0e',          # 标准橙色
            'Ssym_Hybrid': '#2ca02c'  # 标准绿色
        }
    
    # 严格按照指定顺序绘制系列
    for key in series_order:
        if key not in kwargs:
            continue  # 跳过不在kwargs中的系列,避免报错
        values = kwargs[key]
        temp, = ax1.plot(
            np.arange(1, n+1, 1).tolist(), 
            values, 
            label=key,
            color=color_map.get(key)  # 应用固定颜色
        )
        my_handles.append(temp)
    
    ax1.legend(loc='lower right', handles=my_handles)
    ax1.grid(True, which='both')
    plt.show()

# 调用时指定固定顺序,kwargs传入顺序不影响最终显示
plot_with_fixed_list(
    300, 
    series_order=['FA_Hybrid', 'BP', 'Ssym_Hybrid'],
    FA_Hybrid=fa, 
    BP=bp, 
    Ssym_Hybrid=ssym
)

代码细节说明

  1. series_order参数:不管你kwargs里的参数怎么排序,绘图和图例都会严格按照这个列表的顺序来展示,彻底解决随机变动的问题。
  2. color_map参数:你可以替换成自己喜欢的颜色(十六进制码、颜色名称都可以),确保每个系列的颜色永远固定。
  3. 容错处理:如果series_order里的某个系列没出现在kwargs中,代码会自动跳过,不会抛出错误。

这样调整后,图例顺序和曲线颜色就完全可控了,再也不会出现随机变动的情况!

内容的提问来源于stack exchange,提问作者Daily Coder Weekly Hooper

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:46:14