如何在R中按班级循环生成雷达图?代码仅输出最后一张图求助
问题解决:为每个班级生成雷达图
原代码问题分析
nrange <- 2仅指定单个循环值,无法遍历所有班级- 索引
df[i,2:3]是按行号取数据,而非筛选对应班级的记录 - 循环中每次用
plot <- ...覆盖之前的图对象,最终仅保留最后一次生成的图
修正后的代码方案
第一步:构造数据框(若未定义)
df <- data.frame( group = c("Name1", "Name2", "Name3"), Class = c(7, 7, 6), Maths = c(74, 80, 69), Science = c(78, 91, 80) )
方案一:循环+列表存储(基础版)
library(ggradar) # 获取所有唯一班级 unique_classes <- unique(df$Class) # 创建空列表存储所有雷达图 plot_list <- list() for (i in seq_along(unique_classes)) { # 筛选当前班级的目标数据(保留group列用于分组标识) class_data <- df[df$Class == unique_classes[i], c("group", "Maths", "Science")] # 生成雷达图 current_plot <- ggradar(class_data, values.radar = c(0, 50, 100), group.line.width = 1, group.point.size = 2, legend.position = "bottom", plot.title = paste("班级", unique_classes[i])) # 将图存入列表 plot_list[[i]] <- current_plot # 实时打印当前图(可选,运行时会逐个显示) print(current_plot) } # 后续可单独调用某班级的图,例如:plot_list[[1]](7班)、plot_list[[2]](6班)
方案二:用purrr分组生成(简洁版)
library(ggradar) library(dplyr) library(purrr) # 按Class分组,批量生成雷达图并存储到列表 plot_list <- df %>% group_split(Class) %>% map(function(sub_data) { class_num <- unique(sub_data$Class) ggradar(sub_data[, c("group", "Maths", "Science")], values.radar = c(0, 50, 100), group.line.width = 1, group.point.size = 2, legend.position = "bottom", plot.title = paste("班级", class_num)) }) # 逐个打印所有图 walk(plot_list, print)
关键修正点
- 改用
unique(df$Class)获取所有班级,确保遍历每个班级 - 用
df$Class == unique_classes[i]筛选对应班级的所有数据,而非按行号取数 - 使用列表存储每个班级的图避免覆盖,或在循环内直接打印每个图
内容的提问来源于stack exchange,提问作者user20505088
相关产品推荐
相关产品推荐

