You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:18:01