R语言基于100次随机抽样结果绘制多物种箱线图问题
问题原因
- 你在循环内每次抽样完成后直接调用绘图函数,所以仅能生成单次抽样的箱线图,没有用到全部100次的抽样数据
- 用
[,2:5]硬编码列索引的方式不稳健,一是列顺序变动就会失效,二是你这里漏选了species_5(物种列实际是第2到第6列,共5个物种) - 基础绘图系统的
boxplot()返回的是统计量列表,不是ggplot对象,直接加theme()语法会报错
优化实现方案
我们先完成全部100次抽样、合并所有抽样数据后再统一绘图,同时用列名匹配的方式筛选物种列,更稳健。
首先加载所需依赖包:
library(tidyverse)
完整实现代码:
# 先解分组,避免分组数据抽样异常 homer_cpue_wide <- ungroup(homer_cpue_wide) n_simu <- 100 # 抽样次数 sample_size <- 5 # 每次抽样点位数量 # 完成全部抽样,合并所有数据 all_sample <- map_dfr(1:n_simu, function(sim_id){ # 无放回抽5个点位 sample_idx <- sample(1:nrow(homer_cpue_wide), sample_size, replace = FALSE) homer_cpue_wide[sample_idx, ] %>% mutate(sim_id = sim_id) # 标记属于第几次抽样 }) # 转长格式,筛选需要的物种列,用列名匹配避免硬编码索引 plot_data <- all_sample %>% select(sim_id, starts_with("species_")) %>% pivot_longer(cols = -sim_id, names_to = "species", values_to = "cpue") # 绘制箱线图 ggplot(plot_data, aes(x = species, y = cpue)) + geom_boxplot(na.rm = TRUE) + labs(x = "物种", y = "CPUE估计值") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
代码说明
- 用
ungroup()先解除原数据的分组结构,避免抽样时出现非预期的分组抽样问题 - 用
starts_with("species_")匹配物种列,只要列名符合前缀规则就能正确选中,不受列顺序影响 - 用
map_dfr替代for循环完成抽样,直接合并所有抽样结果为一个数据框,不用手动维护列表 - 最后统一用长格式数据绘图,每个箱线图自动对应该物种全部100次抽样的所有观测值
内容的提问来源于stack exchange,提问作者hugh_man
相关产品推荐
相关产品推荐

