
本文介绍如何正确绘制离散随机变量(如二项分布)的概率质量函数(PMF)条形图,指出常见误区(误用 plt.hist),并提供基于 plt.bar 的简洁、准确实现方案。
本文介绍如何正确绘制离散随机变量(如二项分布)的概率质量函数(pmf)条形图,指出常见误区(误用 `plt.hist`),并提供基于 `plt.bar` 的简洁、准确实现方案。
在可视化离散分布(如二项分布、泊松分布或超几何分布)时,必须使用条形图(bar chart)而非直方图(histogram)。这是因为直方图默认将数据分组到连续区间(bins)中,并统计频数或密度,适用于连续变量;而离散分布的 PMF 是定义在孤立整数点上的精确概率值,每个 x 值对应唯一确定的概率 $ P(X = x) $,需用独立、等宽、不重叠的竖直条清晰表达。
原代码中的主要错误在于:
- 错误调用
plt.hist(x=x, y=prob)——plt.hist()不接受y参数,且其设计初衷是接收原始样本数据(如plt.hist(data)),而非预计算的概率值; - 循环中对每个
x单独调用plt.hist和plt.show(),导致生成 11 个独立窗口,既低效又无法呈现整体分布形态。
✅ 正确做法是:
- 预先生成所有支持点(如
x = [0, 1, ..., 10]); - 批量计算对应 PMF 值(
binom.pmf(x, n=10, p=0.5)); - 使用
plt.bar(x, prob)绘制条形图,确保横轴为离散取值、纵轴为精确概率。
以下是完整、可复用的示例代码:
import matplotlib.pyplot as plt
from scipy.stats import binom
# 定义二项分布参数:n=10 次试验,成功概率 p=0.5
n, p = 10, 0.5
x = list(range(n + 1)) # 支持集:0 到 10(含)
prob = binom.pmf(x, n, p) # 批量计算 PMF
# 绘制 PMF 条形图
plt.figure(figsize=(8, 5))
plt.bar(x, prob, color='steelblue', alpha=0.7, edgecolor='black', linewidth=0.5)
plt.xlabel('Number of Successes ($x$)', fontsize=12)
plt.ylabel('Probability $P(X = x)$', fontsize=12)
plt.title('PMF of Binomial Distribution: $X \sim \text{Binom}(n=10, p=0.5)$', fontsize=14)
plt.xticks(x) # 确保 x 轴只显示整数刻度
plt.grid(axis='y', alpha=0.3)
plt.tight_layout()
plt.show()? 关键注意事项:
- ✅ 始终使用
plt.bar()(非plt.hist()或plt.plot())表示离散 PMF; - ✅
x必须为数值列表(如range(11)),不可为单个标量; - ✅ 若需多分布对比,可用
plt.bar(..., width=0.4, align='edge')并调整偏移实现并排条形图; - ⚠️ 避免在循环内反复调用
plt.show(),应在全部绘图逻辑完成后统一展示; - ? 可通过
sum(prob)验证概率总和是否 ≈ 1.0(浮点精度范围内),作为计算正确性的快速检查。
掌握这一方法后,您可轻松扩展至任意离散分布(如 poisson.pmf、hypergeom.pmf),只需替换分布对象与参数即可。条形图不仅是视觉上最直观的表达方式,更是统计意义上最严谨的 PMF 展示形式。

















