使用ggscatterstats绘制分组散点图的函数问题排查
问题解决方案
问题1:空数据集导致的报错
问题原因
- 循环中Level筛选写死为
Level == 1,没有使用循环变量level,Level循环完全无效 - Project循环时直接覆盖了Level筛选的结果,没有同时筛选Level和Project两个分组条件
- 未判断筛选后的数据集是否为空,空数据集传入
ggscatterstats会触发图层构建错误
解决代码
修改后的函数会同时筛选Level和Project,且遇到空数据集时自动跳过:
var_look2 <- function(data) { var_names <- data %>% select(q1:q4) %>% colnames() levels <- unique(data$Level) # 改用数据中实际存在的Level值,避免循环不存在的等级 projects <- unique(data$Project) df_cor <- data %>% mutate_if(is.character, as.factor) %>% mutate_if(is.factor, as.numeric) for(var in var_names) { for (level in levels) { for(project in projects) { # 同时筛选Level和Project data_subset <- subset(df_cor, Level == level & Project == project) n <- nrow(data_subset) # 空数据集直接跳过 if(n == 0) next p<- ggscatterstats( data = data_subset, type = "non-parametric", x = .data[[var]], # 用.data[[var]]替代{{var}},更适合字符串变量 y = q1, bf.message = FALSE, title = paste(project, "scatterplot level", level, "N =", n), marginal = TRUE ) ggsave(filename = paste0(project, "_", var, "_level", level, ".jpeg"), plot = p, width = 1000, height = 1000, units = "px", scale = 1) } } } }
问题2:绘图列表返回NULL的问题
问题原因
- 函数内部未初始化
plot_list,直接赋值会导致对象不存在 - 函数执行完毕后没有返回
plot_list,调用函数时自然得到NULL - 标题中使用
{{var}}无效,因为var是字符串变量,无需tidyeval语法
解决代码
初始化列表并在末尾返回,同时修正标题的变量引用:
var_look2 <- function(data) { var_names <- data %>% select(q1:q4) %>% colnames() levels <- unique(data$Level) projects <- unique(data$Project) df_cor <- data %>% mutate_if(is.character, as.factor) %>% mutate_if(is.factor, as.numeric) # 初始化空列表 plot_list <- list() for(var in var_names) { for (level in levels) { for(project in projects) { data_subset <- subset(df_cor, Level == level & Project == project) n <- nrow(data_subset) if(n == 0) next p<- ggscatterstats( data = data_subset, type = "non-parametric", x = .data[[var]], y = q1, bf.message = FALSE, title = paste(project, var, "scatterplot level", level, "N =", n), marginal = TRUE ) # 将绘图存入列表 plot_list[[paste0(project, "_", var, "_level", level)]] <- p # 可选:同时保存图片 ggsave(filename = paste0(project, "_", var, "_level", level, ".jpeg"), plot = p, width = 1000, height = 1000, units = "px", scale = 1) } } } # 返回绘图列表 return(plot_list) }
调用方式:
plot_list <- var_look2(data)
内容的提问来源于stack exchange,提问作者edodar
相关产品推荐
相关产品推荐

