使用ggscatter按分组着色时的问题:保留整体Spearman回归线
散点图按分组着色但保留单条整体回归线的解决方法
问题场景
你使用ggscatter绘制散点图时,希望让点按分类变量Core分组着色,但添加color = "Core"或fill = "Core"后,生成了多条分组回归线——而你需要的是一条基于全量数据的Spearman回归线。
初始代码:
q <- ggscatter(ARAL_R, x = "Intl1", y = "Sul1", add = "reg.line", conf.int = TRUE, cor.coef = TRUE, cor.method = "spearman", xlab = "Intl1 (copies/g)", ylab = "Sul1 (copies/g)") + stat_cor(label.y = 1, label.x.npc = "center") + stat_regline_equation(label.y = 0.5, label.x.npc = "center")
问题原因
ggscatter会把你传入的color = "Core"作为全局美学映射,传递给所有后续图层(包括reg.line、stat_cor),导致所有统计计算都按Core分组执行,因此生成了多条回归线。
解决方案
把点的分组着色和整体统计图层分开处理,不让统计图层继承分组映射:
修改后的代码:
q <- ggscatter(ARAL_R, x = "Intl1", y = "Sul1", color = "Core", xlab = "Intl1 (copies/g)", ylab = "Sul1 (copies/g)") + # 手动添加全量数据的回归线+置信区间,关闭美学继承 geom_smooth(method = "lm", se = TRUE, color = "black", inherit.aes = FALSE, data = ARAL_R, aes(x = Intl1, y = Sul1)) + # 添加全量数据的Spearman相关系数 stat_cor(data = ARAL_R, aes(x = Intl1, y = Sul1), method = "spearman", label.y = 1, label.x.npc = "center") + # 添加全量数据的回归方程 stat_regline_equation(data = ARAL_R, aes(x = Intl1, y = Sul1), label.y = 0.5, label.x.npc = "center")
关键说明
inherit.aes = FALSE:强制geom_smooth不使用ggscatter里的color = "Core"分组规则,直接用全量数据计算回归;- 每个统计图层都显式指定
data = ARAL_R和不带分组的aes,确保所有统计结果都基于完整数据集,而非分组数据。
内容的提问来源于stack exchange,提问作者M.Cairó
相关产品推荐
相关产品推荐

