dplyr和ggplot管道未按预期工作

时间:2017-05-17 12:49:51

标签: r ggplot2 dplyr

我找不到以下两个问题的解决方案:

首先我试试这个:

library(tidyverse)
gg <- mtcars %>% 
      mutate(group=ifelse(gear==3,1,2)) %>%      
      ggplot(aes(x=carb, y=drat)) + geom_point(shape=group)

Error in layer(data = data, mapping = mapping, stat = stat, geom = 
GeomPoint,:object 'group' not found

显然不起作用。但是使用像.$group这样的东西也不成功。值得注意的是,我必须在aes()

之外指定形状

第二个问题是这个。我无法在管道中调用已保存的ggplot(gg)。

gg <- mtcars %>% 
      mutate(group=ifelse(gear==3,1,2)) %>%      
      ggplot(aes(x=carb, y=drat)) + geom_point()


    mtcars %>% 
        filter(vs == 0) %>% 
        gg + geom_point(aes(x=carb, y=drat), size = 4)  

Error in gg(.) : could not find function "gg"

感谢您的帮助!

修改

很长一段时间后,我找到了解决方案here。必须在{}中设置完整的ggplot术语。

mtcars %>% 
   mutate(group=ifelse(gear==3,1,2)) %>% {     
   ggplot(.,aes(carb,drat)) +
       geom_point(shape=.$group)}

1 个答案:

答案 0 :(得分:2)

如果您将shape定义包含在aes()中,则可以获得所需的行为。要在shape之外使用aes(),您可以传递一个值(即shape=1)。另请注意,group转换为离散var,geom_point在将连续var传递给shape时会引发错误。

library(tidyverse)

gg <- mtcars %>% 
  mutate(group=ifelse(gear==3,1,2)) %>%      
  ggplot(aes(x=carb, y=drat)) + 
  geom_point(aes(shape=as.factor(group)))

gg

其次,%>%运算符在被称为lhs %>% rhs时,假定rhs是一个函数。因此,如错误所示,您将gg作为函数调用。将绘图作为函数调用数据框(即gg(mtcars))不是有效的操作。

请参阅@docendo discimus关于如何使用{}完成从magrittr管道向现有ggplot对象添加图层的问题的评论。