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

ggplot2中geom_smooth()绘制含分类x轴的线性回归线问题

分类x轴散点图添加线性回归线的解决方案

当x轴是分类变量时,ggplot2默认会按x的每个水平分组拟合模型,但每个分类水平对应的底层数值是单一整数(比如A对应1,B对应2),单个x值无法生成直线,因此不会画出跨组的回归线,也不会抛出警告或错误。

要实现跨分类组的线性回归线,有几种简单的解决方式:

方法1:强制整体拟合(最简便)

在geom_smooth的aes里指定group = 1,让ggplot将所有数据当作一个整体拟合线性模型:

library(ggplot2)

dat <- data.frame(group = as.factor(c(rep("A", 10), rep("B", 10))),
                  variable = c(rnorm(10, mean = 3), rnorm(10, mean = 12)))
dat$group <- factor(dat$group, levels = c("A", "B"))

ggplot(dat, aes(x = group, y = variable)) +
  geom_point() +
  geom_smooth(method = "lm", aes(group = 1), se = FALSE) # 添加group=1强制整体拟合

方法2:将分类变量转为数值型

把因子变量转成对应的数值,再拟合回归线,最后手动设置x轴标签还原分类名称:

dat$group_num <- as.numeric(dat$group)

ggplot(dat, aes(x = group_num, y = variable)) +
  geom_point() +
  geom_smooth(method = "lm", se = FALSE) +
  scale_x_continuous(breaks = 1:2, labels = levels(dat$group)) # 还原分类标签

方法3:手动计算回归系数后添加直线

先拟合线性模型,提取截距和斜率,用geom_abline添加回归线:

# 拟合模型,将group转为数值变量
lm_model <- lm(variable ~ as.numeric(group), data = dat)

ggplot(dat, aes(x = group, y = variable)) +
  geom_point() +
  geom_abline(intercept = coef(lm_model)[1], slope = coef(lm_model)[2], color = "#00BFC4")

如果是想给每个分类组单独绘制水平线(每个组的拟合线),可以去掉group=1,但此时每个组只有一个x值,拟合出的是平行于x轴的水平线。

内容的提问来源于stack exchange,提问作者empetrum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 15:38:42