如何用条形图可视化离散分布PMF?修正二项分布绘图错误
解决方法
你的代码存在两个关键问题:
plt.hist用法错误:hist是用来统计输入数据的频率分布,不需要传入y参数,它会自动计算数据的频数/频率,而非直接绘制给定的概率值。- 循环+多次
plt.show():每次循环仅处理一个x值,且立刻显示图形,导致生成11个独立窗口,每个窗口仅含一个柱子。
要生成目标样式的二项分布概率图形,正确做法是一次性计算所有x对应的概率,再用plt.bar绘制(离散分布用条形图更贴合需求),代码如下:
import matplotlib.pyplot as plt from scipy.stats import binom # 生成所有x取值(0到10) x_values = range(11) # 计算每个x对应的二项分布概率质量函数值 pmf_values = binom.pmf(x_values, n=10, p=0.5) # 绘制条形图 plt.bar(x_values, pmf_values, width=0.8, color='skyblue', edgecolor='black') # 添加图形标注 plt.title('二项分布概率质量函数 (n=10, p=0.5)') plt.xlabel('x') plt.ylabel('概率 P(X=x)') plt.xticks(x_values) # 确保x轴显示所有整数刻度 plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show()
若你更倾向于基于样本数据的直方图样式,可先生成大量符合该二项分布的样本,再绘制直方图并叠加理论概率曲线:
import matplotlib.pyplot as plt from scipy.stats import binom import numpy as np # 生成10000个符合二项分布的样本 samples = binom.rvs(n=10, p=0.5, size=10000) # 绘制直方图(密度归一化,与PMF匹配) plt.hist(samples, bins=np.arange(0, 12)-0.5, density=True, alpha=0.6, color='skyblue', edgecolor='black') # 绘制理论PMF曲线 x_values = range(11) pmf_values = binom.pmf(x_values, n=10, p=0.5) plt.plot(x_values, pmf_values, 'ro-', label='PMF') plt.title('二项分布样本直方图与PMF') plt.xlabel('x') plt.ylabel('密度/概率') plt.xticks(x_values) plt.legend() plt.grid(axis='y', linestyle='--', alpha=0.7) plt.show()
这两种方式都能生成你需要的目标图形,第一种直接绘制理论概率的条形图,第二种基于样本数据生成直方图并叠加理论曲线。
内容的提问来源于stack exchange,提问作者Dason Lau
相关产品推荐
相关产品推荐

