Seaborn lmplot 与方程和 R2 测试

Posted

技术标签:

【中文标题】Seaborn lmplot 与方程和 R2 测试【英文标题】:Seaborn implot with equation and R2 text 【发布时间】:2014-10-24 02:41:06 【问题描述】:

在我的常规数据分析工作中,自从 seaborn 包可用以来,我已转而使用 100% python。非常感谢这个美妙的包裹。 但是,我想念的一个 excel 图表功能是在使用 lmplot() 函数时显示 polyfit 方程和/或 R2 值。有谁知道添加它的简单方法?

【问题讨论】:

How do I calculate r-squared using Python and Numpy?的可能重复 这并不是真正的重复,因为问题是这是否可以由 seaborn 函数自动添加,而不是如何手动计算。 【参考方案1】:

不能使用 lmplot 自动完成,因为当有多个回归拟合(即使用 huerowcol 变量时,该值应对应的值未定义。

但这是类似jointplot 函数的一部分。默认显示相关系数和p值:

import seaborn as sns
import numpy as np

x, y = np.random.randn(2, 40)
sns.jointplot(x, y, kind="reg")

但是你可以传递任何函数。如果你想要 R^2,你可以这样做:

from scipy import stats
def r2(x, y):
    return stats.pearsonr(x, y)[0] ** 2
sns.jointplot(x, y, kind="reg", stat_func=r2)

【讨论】:

谢谢,我想我可以一一使用jointplot(),而不是lmplot() 的多图表功能。但是,顶部/侧面直方图是否可以是可选的,以便我可以将许多直方图打包到 lmplot() 等效项中。 这里的 p 值 (0,22) 是多少?我猜 pearson 相关性就是 pearsonr 值。 @cacert:见docs.scipy.org/doc/scipy/reference/generated/… - 看到与两个完全独立的变量相关的概率。 Seaborn 0.11 不再支持此功能,尽管它曾经在 Seaborn 0.9 中工作。【参考方案2】:

现在可以使用 FacetGrid 方法 .map() 或 .map_dataframe() 来完成:

import seaborn as sns
import scipy as sp

tips = sns.load_dataset('tips')
g = sns.lmplot(x='total_bill', y='tip', data=tips, row='sex',
               col='time', height=3, aspect=1)

def annotate(data, **kws):
    r, p = sp.stats.pearsonr(data['total_bill'], data['tip'])
    ax = plt.gca()
    ax.text(.05, .8, 'r=:.2f, p=:.2g'.format(r, p),
            transform=ax.transAxes)
    
g.map_dataframe(annotate)
plt.show()

【讨论】:

谢谢 Marcos,如果在你的 annotate() 中,x,y 被改变了,怎么办?我正在尝试这样做: def annotate(data,x,y), r, p = sp.stats.pearsonr(data[x], data[y]), 然后 g.map_dataframe(annotate(data,x, y),然后出现 AttributeError: 'NoneType' object has no attribute 'module' 的错误。感谢您的帮助 我不确定我是否理解你的问题。 x 和 y 在我给出的示例中的四个子图中发生了变化。也许您可以提供一个实际示例,其中包含您需要的代码。在您的情况下,x 和 y 必须是数据框数据的列,那么您应该使用 data['x'], data['y'], 带引号,而不是 data[x], data[y]。跨度> 谢谢马科斯,这是我所做的: def annotate(data, x,y,**kws): r, p = sp.stats.pearsonr(data['x'], data[ y']) ax = plt.gca() ax.text(.05, .8, 'r=:.2f, p=:.2g'.format(r, p), transform=ax. transAxes) g.map_dataframe(annotate(data,x,y) plt.show(),然后我在使用 g.map_dataframe(annotate(data,x,y) 时出错。如何更正最后一行?谢谢跨度>

以上是关于Seaborn lmplot 与方程和 R2 测试的主要内容,如果未能解决你的问题,请参考以下文章

如何在不命名 DataFrame 列的情况下使用 Seaborn.lmplot 函数?

seaborn 的 lmplot 的输出没有绘制散点图和线性回归

seaborn:lmplot() 得到了一个意外的关键字参数“figsize”

在seaborn lmplot中访问轴对象[重复]

将类似日期时间的对象传递给 seaborn.lmplot

如何在 seaborn lmplot 上添加标题?