Seaborn 的创建者has unfortunately stated 他不会添加这样的功能。下面是一些选项。 (最后一部分包含我最初的建议,这是一个使用 seaborn 的私有实现细节的 hack,并不是特别灵活。)
regplot 的简单替代版本
以下函数在散点图上覆盖一条拟合线并返回来自statsmodels 的结果。这支持sns.regplot 的最简单也可能是最常见的用法,但没有实现任何更高级的功能。
import statsmodels.api as sm
def simple_regplot(
x, y, n_std=2, n_pts=100, ax=None, scatter_kws=None, line_kws=None, ci_kws=None
):
""" Draw a regression line with error interval. """
ax = plt.gca() if ax is None else ax
# calculate best-fit line and interval
x_fit = sm.add_constant(x)
fit_results = sm.OLS(y, x_fit).fit()
eval_x = sm.add_constant(np.linspace(np.min(x), np.max(x), n_pts))
pred = fit_results.get_prediction(eval_x)
# draw the fit line and error interval
ci_kws = {} if ci_kws is None else ci_kws
ax.fill_between(
eval_x[:, 1],
pred.predicted_mean - n_std * pred.se_mean,
pred.predicted_mean + n_std * pred.se_mean,
alpha=0.5,
**ci_kws,
)
line_kws = {} if line_kws is None else line_kws
h = ax.plot(eval_x[:, 1], pred.predicted_mean, **line_kws)
# draw the scatterplot
scatter_kws = {} if scatter_kws is None else scatter_kws
ax.scatter(x, y, c=h[0].get_color(), **scatter_kws)
return fit_results
statsmodels 的结果包含大量信息,例如:
>>> print(fit_results.summary())
OLS Regression Results
==============================================================================
Dep. Variable: y R-squared: 0.477
Model: OLS Adj. R-squared: 0.471
Method: Least Squares F-statistic: 89.23
Date: Fri, 08 Jan 2021 Prob (F-statistic): 1.93e-15
Time: 17:56:00 Log-Likelihood: -137.94
No. Observations: 100 AIC: 279.9
Df Residuals: 98 BIC: 285.1
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const -0.1417 0.193 -0.735 0.464 -0.524 0.241
x1 3.1456 0.333 9.446 0.000 2.485 3.806
==============================================================================
Omnibus: 2.200 Durbin-Watson: 1.777
Prob(Omnibus): 0.333 Jarque-Bera (JB): 1.518
Skew: -0.002 Prob(JB): 0.468
Kurtosis: 2.396 Cond. No. 4.35
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
sns.regplot 的直接替换(几乎)
上面的方法比我下面的原始答案的优点是它很容易扩展到更复杂的配合。
无耻插件:这是我编写的这样一个扩展的regplot 函数,它实现了sns.regplot 的大部分功能:https://github.com/ttesileanu/pydove。
虽然还缺少一些功能,但我写的功能
- 通过将绘图与统计建模分开来实现灵活性(您还可以轻松访问拟合结果)。
- 对于大型数据集来说要快得多,因为它允许
statsmodels 计算置信区间而不是使用自举。
- 允许稍微多样化的拟合(例如,
log(x) 中的多项式)。
- 允许更细粒度的绘图选项。
旧答案
Seaborn 的创建者 has unfortunately stated 他不会添加这样的功能,所以这里有一个解决方法。
def regplot(
*args,
line_kws=None,
marker=None,
scatter_kws=None,
**kwargs
):
# this is the class that `sns.regplot` uses
plotter = sns.regression._RegressionPlotter(*args, **kwargs)
# this is essentially the code from `sns.regplot`
ax = kwargs.get("ax", None)
if ax is None:
ax = plt.gca()
scatter_kws = {} if scatter_kws is None else copy.copy(scatter_kws)
scatter_kws["marker"] = marker
line_kws = {} if line_kws is None else copy.copy(line_kws)
plotter.plot(ax, scatter_kws, line_kws)
# unfortunately the regression results aren't stored, so we rerun
grid, yhat, err_bands = plotter.fit_regression(plt.gca())
# also unfortunately, this doesn't return the parameters, so we infer them
slope = (yhat[-1] - yhat[0]) / (grid[-1] - grid[0])
intercept = yhat[0] - slope * grid[0]
return slope, intercept
请注意,这仅适用于线性回归,因为它只是从回归结果中推断出斜率和截距。好消息是它使用seaborn 自己的回归类,因此可以保证结果与显示的一致。当然,缺点是我们在 seaborn 中使用了一个私有实现细节,它可能随时中断。