使用 displot 或 histplot 绘制高斯拟合直方图

问题描述 投票:0回答:2

我决定尝试一下seaborn 0.11.0 版本!据我了解,使用

displot
函数,它将取代
distplot
。我只是想弄清楚如何在直方图上绘制高斯拟合。这是一些示例代码。

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
中进行呢?

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

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

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

python seaborn histogram gaussian displot
2个回答
8
投票

我也真的很怀念

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])

4
投票

抱歉我参加聚会迟到了。请检查这是否满足您的要求。

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()

© www.soinside.com 2019 - 2024. All rights reserved.