You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何整理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:51:23