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

sns.PairGrid对角线自定义子图添加分层拟合线报KeyError: None求助

解决sns.PairGrid对角线子图添加分组拟合线时的KeyError: None问题

错误原因

  • 核心问题:map_diag传递给自定义函数的xdata是当前对角线变量的单列Series,不包含Source列,因此xdata[hue]会触发KeyError(hue对应列不在xdata中)。
  • 逻辑误区:原代码误将单变量Series当作完整DataFrame处理,且kwargs.get('hue')仅返回列名,无法从xdata中获取分组数据。

修正方案

修改自定义函数,直接从PairGrid对象的完整数据集中按Source分组,针对当前对角线变量计算并绘制拟合线:

import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
from scipy import stats

# 初始化PairGrid
g = sns.PairGrid(
    data=df_combined,
    vars=['Temp (°C)', 'SH (g/kg)', 'CO2 (ppm)', 'PM2.5 (µg/m³)'],
    hue="Source",
    height=2.5, aspect=1.5,
    diag_sharey=False, despine=False
)

def diagonal_with_line(xdata, **kwargs):
    ax = plt.gca()
    var_name = kwargs['var']  # 获取当前对角线子图的变量名
    full_data = g.data  # 获取完整数据集
    
    # 绘制分Source的直方图
    sns.histplot(x=xdata, kde=False, **kwargs, ax=ax)
    
    ax2 = ax.twinx()
    # 为每个Source分组计算正态拟合线并绘制
    for source in full_data['Source'].unique():
        # 提取当前变量的分组数据
        subset = full_data[full_data['Source'] == source][var_name]
        mu, std = np.mean(subset), np.std(subset)
        # 生成拟合线的x轴范围(覆盖98%的数据区间)
        x_vals = np.linspace(stats.norm.ppf(0.01, loc=mu, scale=std),
                             stats.norm.ppf(0.99, loc=mu, scale=std), 1000)
        pdf = stats.norm.pdf(x_vals, loc=mu, scale=std)
        # 使用对应分组的颜色绘制拟合线
        sns.lineplot(x=x_vals, y=pdf, color=kwargs['color'], label=f"{source} 拟合线", ax=ax2)
    
    # 合并双轴图例,避免重复
    handles1, labels1 = ax.get_legend_handles_labels()
    handles2, labels2 = ax2.get_legend_handles_labels()
    ax.legend(handles1 + handles2, labels1 + labels2, loc='upper right')
    ax2.get_legend().remove()

# 应用自定义对角线绘图函数
g.map_diag(diagonal_with_line)

# 绘制非对角线散点图
g.map_offdiag(sns.scatterplot)

plt.show()

关键修改点

  1. 获取完整数据集:通过g.data访问PairGrid的原始数据,替代仅包含单变量的xdata。
  2. 定位当前变量:利用kwargs['var']获取当前对角线子图对应的变量名,精准提取分组数据。
  3. 颜色统一:使用kwargs['color']匹配hue分组的颜色,保持图表风格一致性。
  4. 图例优化:合并双轴图例,避免重复显示造成的视觉混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 13:24:53