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

