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

Seaborn子图添加R²值报错求助:map_dataframe调用问题排查

解决Seaborn子图添加R²值的报错问题

嘿,我一眼就发现你代码里的问题啦!问题出在map_dataframe的调用方式上——你现在直接传了annotate(df),这相当于把函数执行后的结果(其实是None,因为你的annotate函数没有返回值)传给了map_dataframe,但它需要的是函数对象本身,而不是函数调用后的结果。

另外,你提到想要显示R²值,那我们可以把皮尔逊相关系数r平方后得到R²,替换掉原来的r展示。下面是修正后的完整代码:

from scipy import stats
import scipy as sp
import seaborn as sns
import matplotlib.pyplot as plt

# 假设df是你的数据集
g = sns.lmplot(data=df, x='fpw_n', y='AI_PEKEL10_r', hue='River', col="River", col_wrap=4, height=3, sharex=True, sharey=True)

def annotate(data, **kws):
    # 计算皮尔逊相关系数和p值
    r, p = sp.stats.pearsonr(data['fpw_n'], data['AI_PEKEL10_r'])
    # 计算R²值(决定系数)
    r_squared = r ** 2
    ax = plt.gca()
    # 在子图左上角添加文本,用轴坐标确保位置统一
    ax.text(.05, .8, 'R²={:.2f}, p={:.2g}'.format(r_squared, p), transform=ax.transAxes)

# 这里只需要传函数名annotate,Seaborn会自动把每个子图的数据集传给它
g.map_dataframe(annotate)

plt.show()

关键修改点说明:

  • 修正map_dataframe调用:把g.map_dataframe(annotate(df))改成g.map_dataframe(annotate),让Seaborn自动将每个子图对应的数据子集传入annotate的data参数。
  • 添加R²计算:通过r_squared = r ** 2将相关系数转换为决定系数,满足你显示R²的需求。
  • 补全必要导入:确保代码里包含seaborn和matplotlib.pyplot的导入(避免环境缺失导致的隐性报错)。

这样修改后,每个子图都会在左上角显示对应的R²值和p值,代码就能正常运行啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:48:12