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
自动完成,因为当有多个回归拟合(即使用 hue
、row
或 col
变量时,该值应对应的值未定义。
但这是类似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/… - 看到与两个完全独立的变量相关的概率。 Seaborn0.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 的输出没有绘制散点图和线性回归