Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dplyr and ggplot piping is not working as expected

Tags:

r

dplyr

ggplot2

I find no solution for these two following issues:

First I try this:

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

which is obviously not working. But using something like this .$group is also not successfull. Of note, I have to specifiy the shape outside from aes()

The second problem is this. I'm not able to call a saved ggplot (gg) within a pipe.

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"

Thanks for your help!

Edit

After a long time I found a solution here. One has to set the complete ggplot term in {}.

mtcars %>% 
   mutate(group=ifelse(gear==3,1,2)) %>% {     
   ggplot(.,aes(carb,drat)) +
       geom_point(shape=.$group)}
like image 907
Roman Avatar asked Oct 29 '22 07:10

Roman


1 Answers

If you wrap your shape definition in aes() you can get the desired behavior. To use shape outside of aes() you can pass it a single value (ie shape=1). Also note that group is converted to a discrete var, geom_point throws an error when you pass a continuous var to 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

Second, the %>% operator, when called as lhs %>% rhs, assumes that the rhs is a function. So as the error shows, you are calling gg as a function. Calling a plot as a function on a dataframe (ie gg(mtcars)) isnt a valid operation.

See @docendo discimus comment on the question for how to use {} to accomplish adding a layer to an existing ggplot object from a magrittr pipeline.

like image 124
Adam Spannbauer Avatar answered Nov 15 '22 07:11

Adam Spannbauer