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

如何为支持向量回归网格搜索结果创建带统一MAE色条的核函数FacetGrid等高线图

如何用Seaborn FacetGrid为SVR每个核函数绘制统一色条的等高线图?

我完全懂你的需求——给每个SVR核函数单独生成等高线图,整合到一个分面网格里,还要让所有子图共用统一的MAE色条,这样不同核的性能对比才直观。你已经搞定了单个核的绘图,现在扩展到多子图确实需要掌握FacetGrid的自定义绘图技巧,我给你一步步拆解实现方法:

1. 先搞定统一色条的基础:计算全局MAE范围

要让所有子图的色条刻度一致,首先得从整个数据集里算出MAE的最小和最大值,用这个范围来生成统一的颜色层级,避免每个子图自己的色条范围参差不齐:

import numpy as np

# 计算全局MAE的极值,确保所有子图颜色映射范围统一
global_min_mae = df['mae'].min()
global_max_mae = df['mae'].max()
# 生成和你之前一致的12个颜色层级
levels = np.linspace(global_min_mae, global_max_mae, 12)

2. 定义适用于FacetGrid的自定义绘图函数

FacetGrid需要你提供一个能处理单份子集数据的绘图函数,这个函数要接收当前分面的数据集、坐标轴对象,以及我们准备好的全局参数(比如统一的levels):

import seaborn as sns
import matplotlib.pyplot as plt

def plot_svr_contour(data, ax, levels, cmap="RdBu_r"):
    # 提取当前核函数对应的C、epsilon和MAE数据
    C = data["svr__C"]
    epsilon = data["svr__epsilon"]
    score = data["mae"]
    
    # 绘制所有评估点(和你之前的代码一致)
    ax.plot(C, epsilon, "ko", ms=1)
    # 用全局统一的levels绘制等高线填充图
    cntr = ax.tricontourf(C, epsilon, score, levels=levels, cmap=cmap)
    
    # 设置子图的轴标签和标题
    ax.set_xlabel("C")
    ax.set_ylabel("Epsilon")
    ax.set_title(f"Kernel: {data['svr__kernel'].iloc[0]}")
    
    # 调整轴范围为当前核函数对应的参数范围
    ax.set_xlim(C.min(), C.max())
    ax.set_ylim(epsilon.min(), epsilon.max())
    
    return cntr

3. 创建FacetGrid并绘制所有子图

接下来用Seaborn的FacetGrid按svr__kernel分面,然后调用我们的自定义函数。最后手动添加统一的色条(FacetGrid默认不会自动生成全局色条):

# 创建分面网格,col参数指定按核函数分面,col_wrap控制每行子图数量(按需调整)
g = sns.FacetGrid(df, col="svr__kernel", col_wrap=2, figsize=(12, 10))

# 用map_dataframe调用自定义函数,传入全局levels参数
g.map_dataframe(plot_svr_contour, ax=g.axes, levels=levels)

# 添加统一的全局色条
# 取任意一个核函数的contour对象(这里取第一个核的)来生成色条
first_kernel = df['svr__kernel'].unique()[0]
first_cntr = plot_svr_contour(df[df['svr__kernel'] == first_kernel], plt.gca(), levels)
# 把色条添加到整个分面网格的右侧
plt.colorbar(first_cntr, ax=g.axes, label="MAE", shrink=0.8)

# 调整子图间距,让布局更美观
plt.tight_layout()
plt.show()

关键细节提示

  • 统一色条的核心:全程用全局计算的levels,而不是让每个子图自动生成levels,这样所有子图的颜色映射完全对齐,不同核的MAE数值对比才准确。
  • FacetGrid的map_dataframe:这个方法会自动把每个分面的子集数据传给自定义函数,同时支持传递额外的全局参数(比如levels),非常灵活。
  • col_wrap参数:如果你的核函数数量较多,设置col_wrap可以让子图自动换行,避免一行挤太多图导致标签重叠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:32:47