使用ggplot2的stat_function绘制多泊松分布PDF柱状图的问题
排查与解决方案
常见问题分析
用stat_function绘制泊松分布PDF柱状图时,容易踩这些坑:
- 忽略泊松的离散性:
stat_function默认连续采样x值,导致概率计算偏离离散整数点,柱状图位置不对 - 未设置合适的
geom类型:默认是line,不会生成柱状图 - 未处理多分布的显示方式:多个分布重叠或位置错乱,没有用
position_dodge实现并列 - x轴范围未覆盖分布的主要取值区间,导致部分概率被截断
修正后的代码(纯ggplot2,无tidyverse)
library(ggplot2) # 定义要展示的泊松分布lambda参数 lambda_list <- c(2, 5, 10) # 设置x的离散取值范围(覆盖分布的主要区间) x_vals <- 0:20 ggplot() + # 循环添加每个泊松分布的柱状层(base R循环,无需tidyverse) lapply(lambda_list, function(lambda) { stat_function( fun = dpois, # 泊松分布概率密度函数 args = list(lambda = lambda), # 传递当前lambda参数 geom = "col", # 指定绘制柱状图 position = position_dodge(width = 0.8), # 并列显示柱状 n = length(x_vals), # 确保只在指定的离散x点计算概率 xlim = range(x_vals), aes(fill = factor(lambda)) # 用lambda值区分颜色 ) }) + scale_x_continuous(breaks = x_vals) + # x轴显示所有整数点 scale_fill_discrete(name = "λ值") + labs(title = "多泊松分布概率密度", x = "x", y = "P(X=x)") + theme_minimal()
关键修正点
- 强制离散计算:通过
n = length(x_vals)让stat_function只在指定的整数x点计算概率,匹配泊松分布的离散特性(若你的ggplot2版本≥3.4.0,也可直接加discrete = TRUE参数) - 指定柱状几何对象:
geom = "col"确保生成柱状图而非默认的折线 - 并列布局:
position_dodge让不同lambda的柱状图错开显示,避免重叠 - 明确x轴范围:提前定义
x_vals确保覆盖分布的主要取值区间,避免截断
内容的提问来源于stack exchange,提问作者MDsailing
相关产品推荐
相关产品推荐

