如何在直方图同一张图中绘制PDF概率密度函数
在直方图上叠加概率密度函数(PDF)的实现方法
要在直方图上叠加PDF,你可以用**核密度估计(KDE)**来拟合数据的分布,这是一种无需假设数据服从特定分布的通用方法,适合新手快速实现。以下是具体步骤和代码:
步骤说明
- 导入额外需要的库:
numpy(用于数据处理)和scipy.stats.gaussian_kde(用于计算KDE) - 先绘制归一化的直方图(你原来的代码已经设置了
density=True,这一步没问题) - 生成一组连续的x轴数据,用于绘制平滑的PDF曲线
- 计算对应x轴的PDF值
- 最后将PDF曲线叠加到直方图上
完整代码
import matplotlib.pyplot as plt import numpy as np from scipy.stats import gaussian_kde # 你的数据集 data_1 = [0.68417915, 0.53041328, 0.05499373, 0.32483917, 0.30501979, 0.12136537, 0.22964997, 0.5837272, 0.06000122, 0.69908738, 0.15690346, 0.20363323, 0.10390346, 0.98658757, 0.98359924, 0.29493355, 0.72561782, 0.75613625, 0.69628136, 0.71322217, 0.63060554, 0.91118187, 0.14915375, 0.70929528, 0.42408604, 0.35388851, 0.62253336, 0.63676291, 0.44358184, 0.45063505, 0.36477958, 0.15807182, 0.714753, 0.96713497, 0.4094859, 0.56495619, 0.57509395, 0.9355384, 0.46284749, 0.67779101, 0.92363017, 0.05682404, 0.89631817, 0.52587218, 0.79428246, 0.14486141, 0.31300898, 0.10176549, 0.21841843, 0.25688406, 0.55415834, 0.84957183, 0.76246304, 0.98489949, 0.3936749, 0.51460251, 0.50138111, 0.36060756, 0.44854838, 0.3919771, 0.05113578, 0.23980216, 0.96111616, 0.05969004, 0.63652018, 0.77869691, 0.74565952, 0.53789898, 0.8876854, 0.02370424, 0.75647449, 0.1494505, 0.56362217, 0.84942793, 0.75265825, 0.43319662, 0.1012875, 0.09946243, 0.69463561, 0.46931918, 0.12913483, 0.22142044, 0.77253391, 0.1691685, 0.41114265, 0.011321, 0.41941435, 0.28070956, 0.65810948, 0.58770776, 0.68763623, 0.36828773, 0.70466821, 0.8332811, 0.12652526, 0.16867114, 0.59106388, 0.56926637, 0.87954323, 0.62176163, 0.735566843, 0.100146415, 0.66813762, 0.439246138, 0.37587526, 0.0212544712, 0.368062161, 0.535692768, 0.650231419, 0.751573475, 0.143792206, 0.351057868, 0.00177127799, 0.988480387, 0.873988015, 0.378791845, 0.589179323, 0.405978444, 0.688178816, 0.873515486, 0.366033185, 0.798291151, 0.230921252, 0.000868201375, 0.492515713, 0.456100036, 0.566357689, 0.118801303, 0.815197293, 0.0190998886, 0.491136435, 0.490613456, 0.131219088, 0.8441705, 0.172284226, 0.948296215, 0.736638954, 0.223674369, 0.074638352, 0.156815967, 0.0614167905, 0.955175567, 0.174517808, 0.616529512, 0.702704931, 0.217204373, 0.678545848, 0.899756168, 0.528857712, 0.834009864, 0.587747412, 0.0901901813, 0.99442996, 0.820847209, 0.388627889, 0.799302264, 0.119291073, 0.392748464, 0.484674232, 0.686047613, 0.909811416, 0.411619033, 0.52273858, 0.787679969, 0.831886542, 0.575564445, 0.70330689, 0.43712185, 0.217908948, 0.927734103, 0.169151398, 0.102815443, 0.886529746, 0.912471508, 0.036239436, 0.575760637, 0.90291013, 0.946808438, 0.522324825, 0.0741599515, 0.167554744, 0.967044492, 0.0641305316, 0.202375526, 0.78766475, 0.410928526, 0.3750668, 0.102825038, 0.799960722, 0.515931793, 0.60789199, 0.42265089, 0.250692729, 0.476696332, 0.342881458, 0.456350909, 0.0221493003, 0.922045389, 0.431748031, 0.367451551] def plot_histo_with_pdf(data_list, bin_count): # 绘制归一化直方图 plt.hist(data_list, bins=bin_count, density=True, alpha=0.6, label='直方图') # 计算核密度估计 kde = gaussian_kde(data_list) # 生成连续的x轴数据,覆盖数据的最小值到最大值 x_values = np.linspace(min(data_list), max(data_list), 1000) # 计算对应x轴的PDF值 pdf_values = kde(x_values) # 绘制PDF曲线 plt.plot(x_values, pdf_values, 'r-', label='PDF') # 添加图例和标签 plt.xlabel('数值') plt.ylabel('概率密度') plt.legend() return plt.show() # 调用函数 plot_1 = plot_histo_with_pdf(data_1, 100)
关键细节解释
density=True:确保直方图是归一化的,和PDF的数值范围匹配alpha=0.6:让直方图半透明,避免遮挡PDF曲线gaussian_kde:自动拟合数据的分布,生成平滑的PDF曲线np.linspace:生成足够多的x轴点,保证PDF曲线的平滑度
内容的提问来源于stack exchange,提问作者ilra
相关产品推荐
相关产品推荐

