使用管道运算符

时间:2018-05-23 12:48:30

标签: r plot 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条线性回归线(适用于每种颜色和形状)。我想知道如何获得一条回归线,目前我得到4条线的原因是什么。

2 个答案:

答案 0 :(得分:3)

这不是因为您使用管道操作员,而是因为您将所有aes规格放在一起。这意味着geom_smooth函数需要颜色和形状的所有组合的不同行。一种方法是颠倒geom调用的顺序,并根据您的规范定制单独的aes

png()
print(
 iris %>% 
mutate(petalPlus = as.factor(ifelse(Petal.Length > 5.5, 1, 0))) %>%
ggplot(aes(x = Petal.Length, y = Petal.Width)) + 
   theme_bw() +
   geom_smooth(method = "lm")+
   geom_point(aes(col=Species,shape=petalPlus))
 dev.off() )

enter image description here

答案 1 :(得分:2)

由于geom_smoothshape调用继承了colaes ggplot,因此会得到4行,并且他们隐式定义group aes

要避免它在每个geom中定义aes,或仅在geom_smooth中定义它们,请禁用继承:

library(dplyr)
library(ggplot2)

iris %>% 
  mutate(petalPlus = as.factor(ifelse(Petal.Length > 5.5, 1, 0))) %>%
  ggplot() + 
  geom_point(aes(x = Petal.Length,
                 y = Petal.Width, 
                 col = Species, 
                 shape = petalPlus)) +
  theme_bw() +
  geom_smooth(aes(x = Petal.Length, y = Petal.Width), method = "lm")

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(aes(x = Petal.Length, y = Petal.Width), method = "lm", inherit.aes = FALSE)

reprex package(v0.2.0)创建于2018-05-23。