如何按指定变量的每n个唯一值拆分dataframe并绘图
R语言按Lot分组批量绘图高效方案
核心思路
先对唯一的Lot值做分组标记,再基于组标记拆分/分面,完全不受单个Lot数据行数影响,支持任意N值调整,大数据集下性能稳定。
方案1:生成独立的分组绘图(可单独导出)
- 加载依赖包、设置每组Lot数量
library(tidyverse) N <- 2 # 按需调整每组包含的Lot数量
- 给Lot分配组编号并关联回原数据集
# 为所有唯一Lot分配组号 lot_group_map <- tibble(Lot = unique(df$Lot)) %>% mutate(group_id = rep(1:ceiling(n()/N), each = N, length.out = n())) # 关联组号到原数据 df_with_group <- df %>% left_join(lot_group_map, by = "Lot")
- 嵌套数据批量生成绘图对象
# 按组嵌套数据,每组生成一个ggplot对象存储在列表中 group_plots <- df_with_group %>% nest(data = -group_id) %>% mutate( plot = map2(data, group_id, ~ggplot(.x, aes(x = time, y = Value, color = factor(Lot))) + geom_point() + stat_smooth() + labs(title = paste0("第", .y, "组Lot趋势图"), color = "Lot编号") ) )
你可以直接调取任意组的绘图:print(group_plots$plot[[1]])
也可以批量导出所有图到本地:
walk2(group_plots$plot, group_plots$group_id, ~ggsave(paste0("lot_group_", .y, ".png"), .x, width = 8, height = 5))
方案2:单画布分组分面展示(适合快速预览)
如果不需要单独导出每张图,只是快速查看所有组的趋势,可以直接用分面实现:
library(tidyverse) N <- 2 lot_group_map <- tibble(Lot = unique(df$Lot)) %>% mutate(group_id = rep(1:ceiling(n()/N), each = N, length.out = n())) df %>% left_join(lot_group_map, by = "Lot") %>% ggplot(aes(x = time, y = Value, color = factor(Lot))) + geom_point() + stat_smooth() + facet_wrap(~group_id) + labs(color = "Lot编号")
补充提示:你原有代码中的
filter(Lot == c(123, 265))写法存在逻辑缺陷,筛选多个匹配值应该使用Lot %in% c(123, 265),避免因循环匹配出现错误的筛选结果。
内容的提问来源于stack exchange,提问作者RStam
相关产品推荐
相关产品推荐

