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
相关产品推荐
相关产品推荐

