【问题标题】:Extended regression lines with seaborn regplot使用 seaborn regplot 的扩展回归线
【发布时间】:2017-09-05 08:05:44
【问题描述】:

我进行了搜索,但没有找到重新分级 seaborn 库的答案。我还检查了lmplot()regplot() 的文档,但也没有找到。 是否可以扩展和控制回归线的长度?默认情况下,seaborn 根据 x 轴的长度拟合回归线的长度。另一种选择是使用参数truncate=True - 这会将回归线限制在数据范围内。 其他选择?

在我的示例中,我希望将下回归线向下延伸直到 x=0。并且上面的线一直延伸到和下面的相交处。

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

file = 'cobbles.csv'
df = pd.read_csv(file, sep=',')

sns.regplot(x='downward_temp', y='downward_heat', data=df, ci=None)
sns.regplot(x='upward_temp', y='upward_heat', data=df, ci=None, order=2)


plt.xlim([0,25])
plt.ylim([0,100])
plt.show()

【问题讨论】:

    标签: python pandas matplotlib seaborn


    【解决方案1】:

    如果您在绘图之前知道您的 x 限制,您可以在调用 regplot 之前为轴 set_xlim,然后 seaborn 会将回归线和 CI 扩展到 xlim 的范围内。

    import matplotlib.pyplot as plt
    import pandas as pd
    import seaborn as sns
    
    file = 'cobbles.csv'
    df = pd.read_csv(file, sep=',')
    
    fig, ax = plt.subplots()
    
    xlim = [0,25]
    ax.set_xlim(xlim)
    
    sns.regplot(x='downward_temp', y='downward_heat', data=df, ci=None, ax=ax)
    sns.regplot(x='upward_temp', y='upward_heat', data=df, ci=None, order=2, ax=ax)
    
    ax.set_ylim([0,100])
    plt.show()
    

    【讨论】:

    • 您还需要在 regplot(...) 调用中使用 truncate=False 才能使其正常工作。
    【解决方案2】:

    简答:您只需要在您的 Seaborn 地块之前添加plt.xlim(start,end)


    我想 Seaborn 自动根据绘图限制确定长度可能更有意义。

    同样的问题把我带到了这里,@Serenity 的回答启发了我,xlims = ax.get_xlim() 之类的东西可能会有所帮助。

    之后可能会尝试修复并提交对 Seaborn 的更改。

    【讨论】:

    • 您还需要在 regplot(...) 调用中使用 truncate=False 才能使其正常工作。
    【解决方案3】:

    你必须像 seaborn 一样使用scipy.stats.linregress 来计算线性回归函数。然后您必须生成 x 数组以覆盖画布的新 x 轴限制并在其上绘制扩展回归线。详情看例子:

    import numpy as np; np.random.seed(8)
    
    import seaborn as sns
    import matplotlib.pylab as plt
    import scipy.stats
    
    # test data
    mean, cov = [4, 6], [(1.5, .7), (.7, 1)]
    x, y = np.random.multivariate_normal(mean, cov, 80).T
    ax = sns.regplot(x=x, y=y, color="g")
    
    # extend the canvas
    plt.xlim([0,20])
    plt.ylim([0,15])
    
    # calculate linear regression function
    slope, intercept, r_value, p_value, std_err = \
     scipy.stats.linregress(x=x,y=y)
    
    # plot the regression line on the extended canvas
    xlims = ax.get_xlim()
    new_x = np.arange(xlims[0], xlims[1],(xlims[1]-xlims[0])/250.)
    ax.plot(new_x, intercept + slope *  new_x, color='g', linestyle='-', lw = 2.5)
    
    plt.show()
    

    【讨论】:

    • 谢谢。这也是我解决问题的想法。但不幸的是,这归结为一个散点图加上一条线。在这种情况下,几乎没有 seaborn 的意义。但如果拟合线是幂曲线或对数函数或其他类型的可能函数呢?
    • 寻找 numpy.polyfit 或 scipy.optimize.curve_fit。这是很好的答案:stackoverflow.com/a/3433503/2666859
    【解决方案4】:

    将 truncate 设置为 False 即可完成这项工作。在此处添加此答案,可能会对某人有所帮助

    【讨论】:

    • 太棒了!非常及时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-07
    • 2021-12-10
    • 2016-11-25
    • 2020-08-06
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    相关资源
    最近更新 更多