ggplot2管道操作后geom_smooth生成多条回归线的问题排查与解决
问题:ggplot2使用管道操作后出现多条回归线,如何获取单条回归线?
我在使用ggplot2的管道操作符处理iris数据集时遇到了问题,代码如下:
iris %>% mutate(petalPlus = as.factor(ifelse(Petal.Length > 5.5, 1, 0))) %>% ggplot(aes(x = Petal.Length, y = Petal.Width, col = Species, shape = petalPlus)) + geom_point() + theme_bw() + geom_smooth(method = "lm")
目前生成了4条线性回归线(对应每个颜色和形状的分组组合),我想了解出现该情况的原因,以及如何获取单条回归线。
为什么会出现多条回归线?
咱们来拆解一下这个问题:ggplot2的geom_smooth()默认会继承全局aes()里的所有离散映射变量作为分组依据。你在全局aes里同时设置了col = Species(3个类别)和shape = petalPlus(2个类别),理论上会有3×2=6个分组,但iris数据里只有virginica的花瓣长度有超过5.5的情况,实际有效分组是4个(setosa+0、versicolor+0、virginica+0、virginica+1),所以最终拟合出4条回归线。
简单总结:只要在全局aes里定义了离散变量的映射,geom_smooth()就会自动按这些变量的组合分组拟合线条。
如何获取单条回归线?
根据不同的需求,这里有两种实用的解决方案:
方案1:仅让散点使用分组映射,回归线基于全局数据
把col和shape的映射从全局aes移到geom_point()的局部aes中,这样geom_smooth()就不会继承这些分组变量,会基于整个数据集拟合单条回归线:
iris %>% mutate(petalPlus = as.factor(ifelse(Petal.Length > 5.5, 1, 0))) %>% ggplot(aes(x = Petal.Length, y = Petal.Width)) + geom_point(aes(col = Species, shape = petalPlus)) + theme_bw() + geom_smooth(method = "lm")
方案2:保留散点分组样式,强制回归线不分组
如果你想保留散点按Species和petalPlus的样式,同时让回归线是全局单条,可以在geom_smooth()里明确指定group = 1(强制所有数据归为一组),还可以自定义回归线颜色来和散点区分:
iris %>% mutate(petalPlus = as.factor(ifelse(Petal.Length > 5.5, 1, 0))) %>% ggplot(aes(x = Petal.Length, y = Petal.Width, col = Species, shape = petalPlus)) + geom_point() + theme_bw() + geom_smooth(method = "lm", group = 1, col = "black", linetype = "dashed")
这样散点依然保留原有的颜色和形状区分,而回归线是覆盖整个数据集的单条黑色虚线。
内容的提问来源于stack exchange,提问作者ltrd
相关产品推荐
相关产品推荐

