在 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) 中使用科学记数法