如何在R ggplot中基于列条件为子集数据添加回归直线?
按类别为散点图添加回归直线的解决方案
问题背景
构造如下数据框:
one <- rep(c("a","b","c"), each=5) two <- 1:15 three <- c(1,2,3,4, 2,4,6,8,10,12,14, 3,6,9,12) df <- data.frame(one, two, three)
绘制基础散点图:
ggplot(df, aes(x=two, y=three)) + geom_point()
需求:按one列的不同类别(a、b、c)为散点图叠加三条对应的线性回归直线。
尝试与报错
尝试以下代码:
ggplot(df, aes(x=two, y=three)) + geom_point()+ geom_smooth(data=df$two[df$one == "a"], method='lm',formula=y~x,se=F)
出现错误:
Error in subset.default(df, x = df$two[df$one == "a"]) : 'subset' must be logical
错误原因
geom_smooth的data参数需要传入包含所需x、y变量的完整数据框,而你传入的df$two[df$one == "a"]是单个数值向量,不符合参数要求,因此触发错误。
正确实现方法
方法一:利用分组自动拟合(推荐)
直接在aes中指定颜色/分组映射,ggplot会自动按one的类别分别拟合回归直线,同时通过颜色区分不同类别,可读性更强:
library(ggplot2) ggplot(df, aes(x=two, y=three, color=one)) + geom_point() + geom_smooth(method='lm', formula=y~x, se=FALSE)
方法二:手动筛选子集添加直线
如果需要单独控制每个类别直线的样式(如颜色、线型),可以分别给geom_smooth传入筛选后的完整数据框:
library(ggplot2) ggplot(df, aes(x=two, y=three)) + geom_point() + # 为a类添加回归直线 geom_smooth(data=df[df$one == "a", ], method='lm', formula=y~x, se=FALSE, color="red") + # 为b类添加回归直线 geom_smooth(data=df[df$one == "b", ], method='lm', formula=y~x, se=FALSE, color="blue") + # 为c类添加回归直线 geom_smooth(data=df[df$one == "c", ], method='lm', formula=y~x, se=FALSE, color="green")
内容的提问来源于stack exchange,提问作者Gal Levin
相关产品推荐
相关产品推荐

