Python 如何将直线添加到由任意函数创建的seaborn散点图中

Python 如何将直线添加到由任意函数创建的seaborn散点图中,python,plot,data-visualization,seaborn,visualization,Python,Plot,Data Visualization,Seaborn,Visualization,我希望能够用python创建以下绘图(摘自) 数据如下: hours=[ 0.50, 0.75, 1.00, 1.25, 1.50, 1.75, 1.75, 2.00, 2.25, 2.50, 2.75, 3.00, 3.25, 3.50, 4.00, 4.25, 4.50, 4.75, 5.00, 5.50, ] 通过=[0,0,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,1,1,1,1] df=pd.DataFrame({“hours_study”:hours,“passe

我希望能够用python创建以下绘图(摘自)

数据如下:

hours=[
0.50,
0.75,
1.00,
1.25,
1.50,
1.75,
1.75,
2.00,
2.25,
2.50,
2.75,
3.00,
3.25,
3.50,
4.00,
4.25,
4.50,
4.75,
5.00,
5.50,
]
通过=[0,0,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,1,1,1,1]
df=pd.DataFrame({“hours_study”:hours,“passed”:passed})
通过以下步骤可以轻松创建散点图:

sns.散点图(df.hours\u研究,df.passed)
给予


但我不确定如何才能在绘图中添加线条(在本例中为逻辑曲线)

Matplotlib的绘图可以在任何现有绘图上绘制曲线。要绘制逻辑函数,只需绘制
1/(1+exp(-beta0-beta1*x))
,其中beta0和beta1是将逻辑函数拟合到给定数据的结果。Scikit Learn的
LogisticRegression
是一个可以适应此函数并返回参数的函数:

import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression
import seaborn as sns
import pandas as pd
import numpy as np

def draw_logistic_regression_curve(beta0, beta1, x, **kwargs):
    y = 1 / (1 + np.exp(-beta0 - beta1 * x))
    plt.plot(x, y, '-', **kwargs)


hours = np.array([0.50, 0.75, 1.00, 1.25, 1.50, 1.75, 1.75, 2.00, 2.25, 2.50, 2.75,
                  3.00, 3.25, 3.50, 4.00, 4.25, 4.50, 4.75, 5.00, 5.50])
passed = np.array([0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1])
df = pd.DataFrame({"hours_study": hours, "passed": passed})
sns.scatterplot(df.hours_study, df.passed)

clf = LogisticRegression().fit(hours.reshape(-1, 1), passed)
beta0 = clf.intercept_ # -3.13952411
beta1 = clf.coef_[0] # 1.14860386
x = np.linspace(min(hours) - 0.5, max(hours) + 0.5, 500)
draw_logistic_regression_curve(beta0, beta1, x, color='crimson', label="Sklearn's default estimate")
draw_logistic_regression_curve(-4.0777, 1.5046, x, color='limegreen', label="Wikipedia's estimate")
plt.legend(loc='center right')
plt.show()

sklearn返回的系数似乎不正确(参考维基)。但是问题的主要部分是关于绘图的,所以谢谢(不太确定为什么sklearn返回不同的值-这可能是一个拦截问题吗?)不,两者都不同,但都不正确。它们只是估计beta0和beta1的两种不同方法。维基百科页面有
beta0=-4.0777;beta1=1.5046
,给出的曲线没有太大差异。Sklearn的LogisticRegression有很多选项来估计系数,在上面的答案中只使用了默认参数。哪一个是“最好的”,取决于应用领域。