使用ggplot2比较两个连续分布及动态95%分位数实现方法问询
实现方案
核心调整思路
- 双指数分布替换:双指数分布又称拉普拉斯分布,直接调用
distributional包内置的dist_laplace()即可实现,标准双指数分布的参数为位置参数0、尺度参数1,直接替换原示例中的正态分布配置即可。 - 动态95%分位数边界:提前为每个分布计算对应的95%分位数存入数据集,绘图时通过
after_stat()获取当前点位的x值,匹配当前分布对应的分位数做阈值判断即可,不需要写死固定数值。
完整实现代码
library(dplyr) library(distributional) library(ggdist) library(ggplot2) # 构建分布数据集,预计算每个分布的95%分位数 dists <- tribble( ~dist_name, ~dist_obj, "laplace", dist_laplace(0, 1), # 替换原正态分布为双指数分布 "student_t", dist_student_t(3, 0, 1) ) %>% mutate(q95 = quantile(dist_obj, 0.95)) # 预计算单侧95%分位数,若需要双侧95%范围可分别计算q025和q975 # 绘图 dists %>% ggplot(aes(y = dist_name, dist = dist_obj)) + stat_dist_halfeye( # 动态匹配当前分布的95%分位数做边界判断 aes(fill = after_stat(abs(x) < q95[match(y, dist_name)])) ) + labs(fill = "是否在95%分位数范围内")
关键逻辑说明
如果需要判断的是双侧95%取值范围(即覆盖95%概率的区间),只需要调整预计算逻辑和判断条件即可:
- 预计算阶段增加
mutate(q025 = quantile(dist_obj, 0.025), q975 = quantile(dist_obj, 0.975)) - fill的判断条件改为
after_stat(x > q025[match(y, dist_name)] & x < q975[match(y, dist_name)])
内容的提问来源于stack exchange,提问作者Brian Smith
相关产品推荐
相关产品推荐

