在 seaborn displot/histplot 函数中绘制高斯拟合直方图(不是 distplot)

Posted

技术标签:

【中文标题】在 seaborn displot/histplot 函数中绘制高斯拟合直方图(不是 distplot)【英文标题】:Plotting a gaussian fit to histgram in seaborn displot/histplot function (NOT 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 中进行呢?

【问题讨论】:

【参考方案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。 您可能需要额外添加lineplot 和overlay

以上是关于在 seaborn displot/histplot 函数中绘制高斯拟合直方图(不是 distplot)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Pairplot (seaborn) 中使用科学记数法

在seaborn lmplot中访问轴对象[重复]

Python seaborn大更新,带来全新绘图方式seaborn.objects

如何在 Seaborn 图中设置色调顺序

数据可视化的利器-Seaborn简易入门

在 WxPython 面板中嵌入 Seaborn 图