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
相关产品推荐
相关产品推荐

