如何在seaborn的displot图表上绘制正态分布拟合曲线?
Seaborn displot 绘制正态分布拟合曲线方案
核心实现思路是手动计算待拟合数据的均值、标准差,生成对应正态分布的概率密度值后叠加到displot生成的直方图上,适配所有常规数值数据集,无需针对数据分布做特殊调整。
完整实现代码
import seaborn as sns import matplotlib.pyplot as plt from scipy import stats import numpy as np import pandas as pd # 测试数据可替换为你实际使用的df.extracted np.random.seed(42) df = pd.DataFrame({'extracted': np.random.normal(loc=25, scale=5, size=1000)}) # 1. 绘制基础直方图 g = sns.displot(data=df, x='extracted', bins=40, stat='density', kde=False) # 2. 自动计算当前数据的正态分布参数 mu, std = stats.norm.fit(df['extracted']) # 生成x轴取值区间 xmin, xmax = plt.xlim() x = np.linspace(xmin, xmax, 100) # 计算对应正态分布的概率密度值 p = stats.norm.pdf(x, mu, std) # 3. 叠加拟合曲线 plt.plot(x, p, 'r', linewidth=2, label=f'正态拟合: μ={round(mu,2)}, σ={round(std,2)}') plt.legend() plt.show()
关键参数说明
displot的stat参数设置为density:保证直方图y轴单位为概率密度,和正态分布PDF的单位统一,不会出现曲线和直方图高度不匹配的问题stats.norm.fit()会自动根据输入数据集计算最优的均值μ和标准差σ,无需手动指定,任意均值、标准差的数据集都可以直接适配- 如果你需要使用样本计数作为直方图的统计维度(y轴为样本数量),可以调整代码做单位转换即可适配:
# stat='count'场景适配代码 g = sns.displot(data=df, x='extracted', bins=40, stat='count', kde=False) mu, std = stats.norm.fit(df['extracted']) xmin, xmax = plt.xlim() x = np.linspace(xmin, xmax, 100) p = stats.norm.pdf(x, mu, std) # 单位转换:PDF值 × 样本总数 × 单bin宽度 bin_width = (xmax - xmin)/40 p = p * len(df['extracted']) * bin_width plt.plot(x, p, 'r', linewidth=2, label=f'正态拟合: μ={round(mu,2)}, σ={round(std,2)}')
内容的提问来源于stack exchange,提问作者Borut Flis
相关产品推荐
相关产品推荐

