如何在ggscatter分组散点图中添加全局回归线?
问题
使用R中的ggscatter绘制Pearson相关散点图时,按mycolor列分组着色散点后,工具会为每个分组生成回归线。需求是:保留散点的分组着色,但回归线基于全部数据计算,而非分组计算。
提供的代码示例:
df <- structure(list(my_x = c(131L, 100L, NA, 125L, 50L, 50L, 16L, 3L, 27L, 96L, 176L, 121L, 129L, 84L, 67L, 35L, 36L, 18L, 29L, 29L, 26L, 25L, 24L, 20L, 28L, 22L, 25L, 15L, 0L, 18L, 13L, 17L, 14L, 23L, 27L, NA, 6L, 1L, 7L, 1L, 20L, 30L, 16L, 22L, 23L, 22L, 17L, 12L, 14L, 28L, 16L, 20L, 44L, 27L, 16L, 6L, 10L, 9L, 16L, 2L, 43L, 6L, 2L, 0L, 1L, 1L, 1L, 1L, 2L, 1L, 47L, 22L, 7L, 3L, 4L, 3L, 1L, 1L, 1L, 4L, 4L, 1L, 25L, 3L, 3L, 3L, 6L, 6L, 4L, 1L, 2L, 2L, 5L, 8L, 3L, 5L, 1L, 1L, 1L, 2L, 3L, 6L, 6L, 4L, 8L, 1L, 4L, 1L, 5L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 0L, 0L, 2L, 0L, 1L, 2L, 3L, 3L, 4L, 4L, 3L, 2L, 3L, 1L, 2L, 1L), my_y = c(134L, 90L, 130L, 134L, 44L, 48L, 17L, 4L, 19L, 97L, 178L, 39L, 132L, 90L, 35L, 35L, 36L, 18L, 28L, 14L, 25L, 26L, 24L, 18L, 25L, 22L, 9L, 15L, 0L, 21L, 6L, 15L, 15L, 21L, 27L, 19L, 7L, 0L, 8L, 2L, 10L, 30L, 19L, 23L, 12L, 23L, 16L, 6L, 14L, 29L, 15L, 12L, 21L, 14L, 11L, 7L, 5L, 4L, 16L, 5L, 36L, 5L, 2L, 0L, 1L, 1L, 1L, 1L, 2L, 1L, 50L, 22L, 7L, 3L, 6L, 3L, 1L, 1L, 1L, 4L, 4L, 1L, 21L, 3L, 3L, 3L, 6L, 7L, 4L, 1L, 2L, 2L, 1L, 6L, 3L, 2L, 1L, 1L, 2L, 2L, 3L, 2L, 6L, 7L, 6L, 1L, 4L, 1L, 5L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 0L, 0L, 2L, 0L, 1L, 2L, 3L, 2L, 4L, 4L, 3L, 2L, 3L, 1L, 2L, 1L), mycolor = c("color1", "color1", "color1", "color1", "color1", "color1", "color1", "color1", "color1", "color1", "color1", "color1", "color1", "color1", "color1", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color7", "Turtle", "Turtle", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color2", "color3", "color4", "color4", "color4", "color4", "color4", "color4", "color4", "color4", "color4", "color4", "color4", "color4", "color5", "color5", "color5", "color5", "color5", "color5", "color5", "color5", "color5", "color5", "color5", "color5", "color5", "color5", "color5", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6", "color6")), class = "data.frame", row.names = c(NA, -135L)) # 分组着色但生成多条回归线 df %>% ggscatter(., y="my_y", x="my_x", color="mycolor", add = "reg.line", conf.int = TRUE, cor.coef = TRUE, cor.method = "pearson") # 无着色但生成全局回归线 df %>% ggscatter(., y="my_y", x="my_x", add = "reg.line", conf.int = TRUE, cor.coef = TRUE, cor.method = "pearson")
解决方案
ggscatter本身没有直接参数实现“分组着色+全局回归线”,但可以通过两种方式实现需求:
方法1:ggscatter + ggplot2手动添加全局回归线
先用ggscatter画出分组着色的散点,再用ggplot2的图层添加全局回归线和相关系数:
library(ggpubr) library(ggplot2) df %>% ggscatter(x = "my_x", y = "my_y", color = "mycolor") + # 添加基于全部数据的回归线,se=TRUE显示置信区间 geom_smooth(aes(x = my_x, y = my_y), method = "lm", se = TRUE, color = "black") + # 添加全局Pearson相关系数,可调整label.x/label.y控制位置 stat_cor(aes(x = my_x, y = my_y), method = "pearson", label.x = 50, label.y = 180)
方法2:纯ggplot2实现
如果不需要ggscatter的预设样式,直接用ggplot2更灵活:
library(ggplot2) ggplot(df, aes(x = my_x, y = my_y, color = mycolor)) + geom_point() + # group=1强制忽略分组,使用全部数据拟合回归线 geom_smooth(aes(group = 1), method = "lm", se = TRUE, color = "black") + # 同样用group=1计算全局相关系数 stat_cor(aes(group = 1), method = "pearson", label.x = 50, label.y = 180) + theme_bw() # 可选,匹配ggscatter默认主题风格
内容的提问来源于stack exchange,提问作者MaximeP91
相关产品推荐
相关产品推荐

