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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:00:29