Python 2.7中概率直方图与最佳拟合线无法绘制问题
解决概率直方图与正态拟合线绘制异常问题
我帮你排查了代码里的几个关键问题,这些都是导致图表无法正常显示的常见原因,下面是修正后的完整代码,以及对应的问题解析:
修正后的完整代码
import matplotlib.pyplot as plt from scipy.stats import norm # 假设prob_long是你的一维概率列表/数组 # 创建归一化概率直方图 n, bins, patches = plt.hist( prob_long, # 移除外层的[],直接传入一维数据 bins=[0.36,0.365,0.37,0.375,0.38,0.385,0.39,0.395,0.40,0.405,0.41,0.415,0.42,0.425,0.43,0.435,0.44,0.445,0.45,0.455,0.46,0.465,0.47,0.475,0.48,0.485,0.49,0.495,0.5], density=True, # 替换已弃用的normed=True facecolor='orange', alpha=0.75, ec='black' ) # 计算正态分布拟合参数并绘制拟合线 mu, sigma = norm.fit(prob_long) # 使用scipy的norm.pdf替代过时的mlab.normpdf y = norm.pdf(bins, mu, sigma) plt.plot(bins, y, 'r--', linewidth=2, label=f'Normal Fit ($\mu={mu:.3f}$, $\sigma={sigma:.3f}$)') # 优化图表可读性 plt.xlabel('Probability Value') plt.ylabel('Density') plt.title('Distribution of Long Probabilities') plt.grid(axis='y', alpha=0.3) plt.legend() plt.show()
关键问题解析
数据维度错误
你原来用[prob_long]把一维数据包装成了二维数组,plt.hist处理二维数据时会按子数组拆分绘制,导致直方图计算异常。直接传入prob_long(确保它是一维的数值集合)就能正确统计每个bin的频率。过时参数导致的兼容性问题
normed=True在matplotlib 3.0+版本已被弃用,改用density=True来实现归一化(使直方图总面积为1),避免警告或绘制失败。mlab.normpdf属于过时模块,现在官方推荐使用scipy.stats.norm.pdf来计算正态分布概率密度,兼容性更强。
拟合线代码不完整
你原来的y=mlab.normpdf(bins, ...缺少了拟合得到的均值mu和标准差sigma参数,补全后才能生成对应的拟合曲线。
额外排查点
如果修正后图表还是没有显示,建议检查:
prob_long是否为空列表,或者所有数据是否都不在你指定的bins范围内(如果数据全部超出bins区间,直方图会没有柱子)。- 确保已经正确安装并导入了
matplotlib和scipy库。
内容的提问来源于stack exchange,提问作者JeffStiff
相关产品推荐
相关产品推荐

