【问题标题】:Plotting a gaussian fit to histgram in seaborn displot/histplot function (NOT distplot)在 seaborn displot/histplot 函数中绘制高斯拟合直方图(不是 distplot)
【发布时间】:2021-02-13 16:30:33
【问题描述】:

我决定试一试 seaborn 版本 0.11.0!据我了解,使用将替换 distplot 的 displot 函数。我只是想弄清楚如何将高斯拟合绘制到直方图上。这是一些示例代码。

import seaborn as sns
import numpy as np
x = np.random.normal(size=500) * 0.1

使用 distplot 我可以做到:

sns.distplot(x, kde=False, fit=norm)

但是如何在 displot 或 histplot 中进行呢?

【问题讨论】:

    标签: python plot seaborn gaussian data-fitting


    【解决方案1】:

    对不起,我迟到了。只需检查这是否符合您的要求。

    import numpy as np
    import matplotlib.pyplot as plt
    from scipy.stats import norm
    
    data = np.random.normal(size=500) * 0.1
    mu, std = norm.fit(data)
    
    # Plot the histogram.
    plt.hist(data, bins=25, density=True, alpha=0.6, color='g')
    
    # Plot the PDF.
    xmin, xmax = plt.xlim()
    x = np.linspace(xmin, xmax, 100)
    p = norm.pdf(x, mu, std)
    plt.plot(x, p, 'k', linewidth=2)
    plt.show()
    

    【讨论】:

      【解决方案2】:

      我也很怀念fit 参数。当他们弃用 distplot 函数时,他们似乎没有替换该功能。在他们堵住那个洞之前,我创建了一个简短的函数来将正态分布覆盖添加到我的histplot。我只是将函数与导入一起粘贴到文件顶部,然后只需添加一行即可在需要时添加叠加层。

      import seaborn as sns
      import matplotlib.pyplot as plt
      import numpy as np
      from scipy import stats
      
      def normal(mean, std, color="black"):
          x = np.linspace(mean-4*std, mean+4*std, 200)
          p = stats.norm.pdf(x, mean, std)
          z = plt.plot(x, p, color, linewidth=2)
      
      data = np.random.normal(size=500) * 0.1    
      ax = sns.histplot(x=data, stat="density")
      normal(data.mean(), data.std())
      

      如果您更愿意使用stat="probability" 而不是stat="density",您可以使用以下方式标准化拟合曲线:

      def normal(mean, std, histmax=False, color="black"):
          x = np.linspace(mean-4*std, mean+4*std, 200)
          p = stats.norm.pdf(x, mean, std)
          if histmax:
              p = p*histmax/max(p)
          z = plt.plot(x, p, color, linewidth=2)
      
      data = np.random.normal(size=500) * 0.1    
      ax = sns.histplot(x=data, stat="probability")
      normal(data.mean(), data.std(), histmax=ax.get_ylim()[1])
      

      【讨论】:

      • 在stat="probability"的情况下你对函数做了什么改变?
      • 我编辑了答案以显示该选项。
      【解决方案3】:

      到目前为止,我最接近的是:

      sns.histplot(x,stat="probability", bins=30, kde=True, kde_kws={"bw_adjust":3})
      

      但我认为这只会增加绘制的 kde 的平滑度,这并不是我想要的:'(

      【讨论】:

      • ...您的目的是什么?我认为无论从 OP 还是从这个“答案”中都不是很清楚
      • 我想为我的数据绘制一条高斯/正态分布拟合曲线。发布的“答案”使用 seaborn 的 kde 函数绘制 kde。
      • 您可能需要额外添加lineplotoverlay
      猜你喜欢
      • 2020-12-02
      • 2021-10-22
      • 2016-07-05
      • 2016-05-25
      • 2018-02-13
      • 2017-09-16
      • 1970-01-01
      • 2018-02-17
      相关资源
      最近更新 更多