ggplot2/R中回归线无法显示的问题排查及解决方法求助
ggplot2添加回归线失败的问题排查与修复
问题描述
尝试在ggplot2中给分组数据添加回归线,但图表上看不到线条(仅图例显示线条),代码如下:
p1<-ggplot(data=artemia, aes(x=x1,y=BPM,color=Treatment))+ geom_point()+ geom_smooth(method="lm", formula= y~x)
其中x1是factor()类型,数据集包含6组数据,每个Treatment对应3组。期望实现:要么给6组数据各加一条回归线,要么给每个Treatment各加一条回归线。
问题根源
x1是因子(factor)类型,而geom_smooth(method="lm")的线性回归模型要求x为连续数值型变量。当x是因子时,模型会拟合每个因子水平的均值,若每个x1水平仅对应1个数据点,就无法生成可见的回归线;若有多个点,也只会呈现水平线段,不符合你需要的趋势线效果。
修复方案
场景1:给每个x1分组(6组)各添加一条回归线
- 先将x1转换为连续数值变量:
# 若x1是无序因子,用as.character转成字符再转数值 artemia$x1_num <- as.numeric(as.character(artemia$x1)) # 若x1是有序因子,直接用as.numeric即可 # artemia$x1_num <- as.numeric(artemia$x1) - 修改ggplot代码,指定连续x变量并按x1分组拟合:
p1 <- ggplot(data=artemia, aes(x=x1_num, y=BPM, color=Treatment, group=x1)) + geom_point() + geom_smooth(method="lm", formula=y~x, se=FALSE) # se=FALSE可移除置信区间,按需选择 - (可选)保留原x轴的因子标签:
p1 <- p1 + scale_x_continuous( breaks = 1:length(levels(artemia$x1)), labels = levels(artemia$x1) )
场景2:给每个Treatment各添加一条回归线
- 同样先将x1转换为连续数值变量(步骤同上)
- 修改代码,按Treatment分组拟合回归线:
(注:因p1 <- ggplot(data=artemia, aes(x=x1_num, y=BPM, color=Treatment)) + geom_point() + geom_smooth(method="lm", formula=y~x, se=FALSE)color=Treatment已指定分组,ggplot会自动按Treatment拟合回归线,无需额外加group=Treatment)
额外说明
如果你的x1每个因子水平下仅对应1个数据点,那么即使转换为连续变量,单个点也无法拟合回归线(回归线至少需要2个数据点来计算斜率),这种情况下需要检查数据是否满足拟合条件。
内容的提问来源于stack exchange,提问作者eiion
相关产品推荐
相关产品推荐

