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

如何在Seaborn直方图上叠加正态分布曲线(含对数正态)

解决直方图与PDF曲线叠加的尺度匹配问题

核心原因

直方图默认展示频数/计数,而PDF(概率密度函数)的取值是概率密度(曲线下面积总和为1),两者尺度差异巨大,导致PDF曲线被压缩得几乎不可见。

快速实现正态分布PDF叠加的方法

在seaborn.histplot中添加stat='density'参数,将直方图转换为密度分布,即可和PDF曲线尺度对齐:

import seaborn as sns
import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plt

# 提取DataFrame中需要分析的列(替换为你的列名)
data = df['target_column']

# 绘制密度直方图(stat='density'切换为密度尺度)
sns.histplot(data, bins=100, stat='density', alpha=0.6, label='直方图')

# 计算正态分布参数并生成PDF曲线
mean_val = data.mean()
std_val = data.std()
x = np.linspace(data.min(), data.max(), 1000)  # 生成更平滑的x轴序列
pdf_curve = stats.norm.pdf(x, mean_val, std_val)

# 叠加PDF曲线
plt.plot(x, pdf_curve, 'r', linewidth=2, label='正态分布PDF')

# 添加图例与标签
plt.legend()
plt.xlabel('数值')
plt.ylabel('密度')
plt.show()

对数正态分布的叠加方法

思路一致,但需注意对数正态分布的参数处理:

  1. 用stats.lognorm.fit()从数据中估计分布参数(形状s、位置loc、尺度scale)
  2. 生成PDF时使用stats.lognorm.pdf()

完整代码示例:

import seaborn as sns
import scipy.stats as stats
import numpy as np
import matplotlib.pyplot as plt

data = df['target_column']

# 绘制密度直方图
sns.histplot(data, bins=100, stat='density', alpha=0.6, label='直方图')

# 估计对数正态分布参数(floc=0固定位置参数,符合常规对数正态分布假设)
s_param, loc_param, scale_param = stats.lognorm.fit(data, floc=0)
x = np.linspace(data.min(), data.max(), 1000)
pdf_curve = stats.lognorm.pdf(x, s_param, loc_param, scale_param)

# 叠加PDF曲线
plt.plot(x, pdf_curve, 'g', linewidth=2, label='对数正态分布PDF')

plt.legend()
plt.xlabel('数值')
plt.ylabel('密度')
plt.show()

注意事项

  • 若DataFrame包含多列,务必指定具体分析列,避免seaborn.histplot绘制所有列的混合直方图
  • alpha参数用于调整直方图透明度,让叠加的曲线更清晰

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 03:11:04