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

ggplot循环绘制分组线性回归图时分组失效的问题求助

回归分析图分组/着色失效的原因与解决方法

背景

拥有大型数据库,需重复评估随时间变化的静息能量消耗(REE),对比多个二分类变量(0/1,如是否存在重度颅脑损伤),需为数据库中所有变量生成回归分析图并导出至PDF文件。

当前使用代码

library(tidyverse)
library(ggpmisc)
my_data %>%
pdf(file="Plots.pdf" )
print(colnames(my_data) %>%
        map(function(x) my_data%>%
              ggplot(aes(x = Day, 
                         y = REE,
                         color=as_factor(x)))+
              scale_x_continuous(breaks = c(0,2,4,6,8,10,12,14,16,18,20,22,24,26,28))+
              scale_y_continuous(limits= c(0000,4000))+
              geom_point()+
              geom_smooth(method=lm,
                          se=TRUE,
                          size=2/10,
                          aes(group=as_factor(x)))+ 
              stat_poly_eq(aes(label = paste(after_stat(eq.label),
                                             after_stat(rr.label), 
                                             after_stat(p.value.label),
                                             sep = "*\\" , \\"*"))),
                           label.y="bottom", label.x="right")+
              labs(x="Time [d]",
                   y="Resting Energy Expenditure [kcal]")+
              scale_colour_grey(start=0.7,
                                  end=0.3)+
              theme_bw()
))
dev.off()

问题现象

代码能生成PDF文件,但无法按as_factor(x)实现分组/着色,所有数据点被归为同一组。

原因分析

这里的x是列名的字符串(比如"SevereTBI"),直接写as_factor(x)时,ggplot会把这个字符串本身当成一个固定值,相当于给所有数据点都打上同一个分组标签,自然没法区分不同类别。

解决代码

library(tidyverse)
library(ggpmisc)

# 先打开PDF设备,避免管道上下文导致的异常
pdf(file="Plots.pdf")

colnames(my_data) %>%
  map(function(x) {
    my_data %>%
      ggplot(aes(x = Day, 
                 y = REE,
                 color = as_factor(.data[[x]]), # 用.data[[x]]引用对应列的实际值
                 group = as_factor(.data[[x]]))) + # 全局设置分组,统一应用到所有图层
      scale_x_continuous(breaks = c(0,2,4,6,8,10,12,14,16,18,20,22,24,26,28)) +
      scale_y_continuous(limits = c(0, 4000)) + # 修正0000为合法数值0
      geom_point() +
      geom_smooth(method = lm,
                  se = TRUE,
                  size = 2/10) + # 无需重复设置group,继承全局aes
      stat_poly_eq(aes(label = paste(after_stat(eq.label),
                                     after_stat(rr.label), 
                                     after_stat(p.value.label),
                                     sep = "*\\*")), # 修正转义语法错误
                   label.y = "bottom", 
                   label.x = "right",
                   group = as_factor(.data[[x]])) + # 给统计图层指定分组
      labs(x = "Time [d]",
           y = "Resting Energy Expenditure [kcal]",
           color = x) + # 添加图例标题,显示当前变量名
      scale_colour_grey(start = 0.7, end = 0.3) +
      theme_bw()
  }) %>%
  print() # 批量打印所有生成的图

dev.off()

关键修正点

  • 用.data[[x]]替代直接的x,正确引用数据框中对应列的实际值,再转换为因子实现分组
  • 全局aes中统一设置group和color,让所有图层(点、拟合线、统计标签)都继承分组逻辑
  • 修复stat_poly_eq中sep的转义错误,确保公式标签格式正确
  • 调整PDF设备的打开/关闭位置,避免管道操作导致的绘图上下文问题
  • 添加图例标题,方便识别每个图对应的变量

内容的提问来源于stack exchange,提问作者ctjm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 14:15:30