如何整理purrr::pmap生成的嵌套列表并绘制带分位数参考线的直方图
解决方法:整理数据并绘制带分位数参考线的直方图
你当前用df %>% pmap(rnorm)得到嵌套列表是正常的——因为rnorm返回的是向量,pmap会把每组参数生成的向量打包成列表元素。我们需要把这些数据转换成整洁数据框,同时保留原始的mean、sd、n分组信息,这样后续才能区分不同组来绘图。
步骤1:生成并整理整洁数据
可以用pmap结合tibble生成每个组的结构化数据,再合并成一个大的数据框。这里推荐用pmap_dfr直接返回数据框,写法更简洁:
library(tidyverse) df <- tribble( ~mean, ~sd, ~n, 5.00, 3.00, 100, 4.00, 1.00, 100, 4.00, 2.00, 100 ) # 生成带分组标识的整洁数据框 tidy_df <- df %>% pmap_dfr(function(mean, sd, n) { tibble(value = rnorm(n, mean, sd), mean, sd, n) })
现在tidy_df里每行都是一个随机数,同时附带生成它的mean和sd参数,完美适配后续的分组绘图需求。
步骤2:绘制带分位数参考线的直方图
接下来用ggplot2生成3张子图,每个子图对应一组参数,同时添加中位数、第一四分位数(Q1)、第三四分位数(Q3)的参考线。这里提供两种写法:
写法1:提前计算分位数(更直观)
先算出每个组的分位数,再把参考线对应到每个子图:
# 计算每组的分位数 quantile_df <- tidy_df %>% group_by(mean, sd) %>% summarize( q1 = quantile(value, 0.25), median = median(value), q3 = quantile(value, 0.75), .groups = "drop" ) # 绘图 ggplot(tidy_df, aes(x = value)) + geom_histogram(bins = 15, fill = "steelblue", alpha = 0.7) + # 添加分位数参考线:中位数用实线,Q1/Q3用虚线 geom_vline(data = quantile_df, aes(xintercept = q1), color = "red", linetype = "dashed") + geom_vline(data = quantile_df, aes(xintercept = median), color = "darkred", size = 1) + geom_vline(data = quantile_df, aes(xintercept = q3), color = "red", linetype = "dashed") + # 按参数组合分面,每个子图对应一组数据 facet_wrap(~ paste0("mean=", mean, ", sd=", sd), ncol = 3) + labs(x = "随机数值", y = "频数", title = "正态分布随机数直方图(带分位数参考线)") + theme_bw()
写法2:绘图时直接计算分位数(更简洁)
不需要提前生成分位数数据框,用stat_summary直接在绘图过程中计算:
ggplot(tidy_df, aes(x = value)) + geom_histogram(bins = 15, fill = "steelblue", alpha = 0.7) + stat_summary(geom = "vline", fun = median, color = "darkred", size = 1) + stat_summary(geom = "vline", fun = ~quantile(., 0.25), color = "red", linetype = "dashed") + stat_summary(geom = "vline", fun = ~quantile(., 0.75), color = "red", linetype = "dashed") + facet_wrap(~ paste0("mean=", mean, ", sd=", sd), ncol = 3) + labs(x = "随机数值", y = "频数", title = "正态分布随机数直方图(带分位数参考线)") + theme_bw()
两种写法都能生成3张独立的直方图,每张图都清晰标注了对应组的中位数和四分位数参考线。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

