dplyr 和 ggplot 管道未按预期工作

Rom*_*man 5 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
Run Code Online (Sandbox Code Playgroud)

这显然不起作用。但使用这样的东西.$group也并不成功。值得注意的是,我必须指定外部的形状aes()

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

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"
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助!

编辑

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

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

Ada*_*uer 2

如果您将shape定义包含在内,aes()您可以获得所需的行为。要在shape外部使用,aes()您可以向其传递单个值(即shape=1)。另请注意group转换为离散变量,geom_point当您将连续变量传递给 时会引发错误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
Run Code Online (Sandbox Code Playgroud)

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

请参阅 @docendo discimus 对问题的评论,了解如何使用magrittr 管道{}将图层添加到现有对象。ggplot