在R语言中使用purrr的map2绘图时,group_by参数为何失效?
按Level生成单张绘图的问题解决方法
问题背景
需要按学生的level生成4张绘图(每个level对应一张,包含该层级所有学生数据),但当前代码执行后生成了16张绘图(每个学生对应一张),以下是问题分析和修正方案。
原始尝试代码
# 数据准备 library(dplyr) my_data <- tibble(level = c(rep(c("Kindergarten", "1st", "2nd", "3rd"), 4)), id = c(1:16), score = c(81:96))
# 生成绘图的尝试代码 library(purrr) library(stringr) library(ggplot2) # 提取信息 levels <- my_data %>% pull(level) %>% as.character scores <- my_data %>% pull(score) # 生成绘图 my_plots <- map2( .x = levels, .y = scores, .f = ~{ my_data %>% group_by(level) %>% # 此处分组未生效 ggplot(aes(x = .x, y = .y)) + geom_point() + ggtitle(str_glue("Score by {.x}")) } ) my_plots # 生成了16张图而非预期的4张
错误原因
map2的输入是长度为16的levels和scores向量,会循环16次(对应每一行数据),每次仅处理单个学生的level和score,因此生成16张图。group_by(level)未起到作用:绘图时直接使用了.x和.y(单个值),并未基于分组后的完整数据集进行可视化。
修正方案
方案一:遍历唯一Level值并筛选数据
library(dplyr) library(purrr) library(stringr) library(ggplot2) # 原始数据 my_data <- tibble(level = c(rep(c("Kindergarten", "1st", "2nd", "3rd"), 4)), id = c(1:16), score = c(81:96)) # 获取所有唯一的level值 unique_levels <- unique(my_data$level) # 按每个level生成绘图 my_plots <- map( .x = unique_levels, .f = ~{ # 筛选当前level的所有学生数据 filtered_data <- my_data %>% filter(level == .x) ggplot(filtered_data, aes(x = level, y = score)) + geom_point(size = 2) + # 可选:调整点大小提升可读性 ggtitle(str_glue("Score by {.x}")) + theme_minimal() } ) # 查看结果(共4张图,每张对应一个level) my_plots
方案二:用group_split拆分数据集后遍历
library(dplyr) library(purrr) library(stringr) library(ggplot2) # 原始数据 my_data <- tibble(level = c(rep(c("Kindergarten", "1st", "2nd", "3rd"), 4)), id = c(1:16), score = c(81:96)) # 按level拆分数据为4个数据框的列表 level_data_list <- my_data %>% group_split(level) # 遍历每个子数据集生成绘图 my_plots <- map( .x = level_data_list, .f = ~{ current_level <- .x$level[1] # 获取当前level名称 ggplot(.x, aes(x = level, y = score)) + geom_point(size = 2) + ggtitle(str_glue("Score by {current_level}")) + theme_minimal() } ) my_plots
说明
两种方案均会生成4张绘图,每张图包含对应level下所有学生的分数数据:
- 方案一通过
unique()获取唯一层级,再筛选对应数据绘图,逻辑清晰直观。 - 方案二用
group_split直接拆分数据集,避免手动筛选,代码更简洁。
内容的提问来源于stack exchange,提问作者J.Sabree
相关产品推荐
相关产品推荐

