如何在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()
对数正态分布的叠加方法
思路一致,但需注意对数正态分布的参数处理:
- 用
stats.lognorm.fit()从数据中估计分布参数(形状s、位置loc、尺度scale) - 生成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
相关产品推荐
相关产品推荐

