You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ggscatterstats绘制分组散点图的函数问题排查

问题解决方案

问题1:空数据集导致的报错

问题原因

  1. 循环中Level筛选写死为Level == 1,没有使用循环变量level,Level循环完全无效
  2. Project循环时直接覆盖了Level筛选的结果,没有同时筛选Level和Project两个分组条件
  3. 未判断筛选后的数据集是否为空,空数据集传入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的问题

问题原因

  1. 函数内部未初始化plot_list,直接赋值会导致对象不存在
  2. 函数执行完毕后没有返回plot_list,调用函数时自然得到NULL
  3. 标题中使用{{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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 20:17:38