如何多次运行R带随机抽样的函数并将所有结果绘制在同一张ggplot图中
实现思路
- 把你现有单次采样统计的逻辑封装成独立函数,每次运行都基于原始完整数据集,输出对应单次运行的频率统计结果,同时新增
run_id字段标记当前是第几次重复 - 循环调用该函数5次,合并所有次的统计结果
- 绘图时通过
group参数区分同分类下的不同重复运行结果,即可实现每个分类展示5条趋势线
完整可运行代码
# 加载依赖包 library(tidyverse) # 封装单次运行逻辑的函数 # 参数说明:raw_dat为你的初始完整数据集,run_id为当前重复次数的编号 single_run <- function(raw_dat, run_id) { # 每次运行都从原始完整数据开始处理,避免上一次结果干扰 dat <- raw_dat tot_j <- list() for (i in 0:45) { if (i > 0) { dat <- dat %>% group_by(Plot) %>% sample_n(n() - 1) %>% ungroup() } j <- dat %>% group_by(Category) %>% summarise(n = n()) %>% mutate( freq = n / sum(n), total = 50 - i, run_id = run_id # 新增字段标记本次运行的编号 ) tot_j[[i + 1]] <- j } return(bind_rows(tot_j)) } # 执行5次重复,合并所有结果 # 请将下方raw_dat替换为你自己的初始完整数据集的变量名 all_run_res <- map_dfr(1:5, ~single_run(raw_dat = raw_dat, run_id = .x)) # 绘图 ggplot(subset(all_run_res, Category %in% c("C", "G", "Z", "S"))) + # group参数用于区分同分类下不同次运行的线,alpha设置透明度避免重叠看不清 geom_line(aes(x = total, y = freq, colour = Category, group = interaction(Category, run_id)), alpha = 0.7) + xlim(50, 5)
关键说明
interaction(Category, run_id)会生成类似C.1、C.2的唯一分组标识,让ggplot识别出同分类下的5条线需要分开绘制- 如果你需要明确区分同分类下的不同重复,可以在
aes里新增linetype = factor(run_id)参数,不同次运行的线会自动用不同线型展示 - 透明度参数
alpha可以根据你实际的绘图效果调整,取值范围为0-1,数值越低越透明
内容的提问来源于stack exchange,提问作者Nico
相关产品推荐
相关产品推荐

