管道 (%>%) ggplot2 像 ggvis

pipe (%>%) ggplot2 like ggvis

当我使用 knitr 将表格和图形集成到文档中时,添加代码使其更易于重现和有趣。

通常 dplyrggvis 的组合可以使绘图具有相对清晰的代码(使用 magrittr 管道运算符 %>)。

mtcars %>%
  group_by(cyl, am) %>%
  summarise( weight = mean(wt) ) %>%
  ggvis(x=~am, y=~weight, fill=~cyl) %>%
  layer_bars()

问题是 ggvis 图:

看起来不像 ggplot2 图那么漂亮(我知道,cyl 的分解):

但是,对于 ggplot2,我们需要:

mtcars %>%
  group_by(am, cyl) %>%
  summarise( weight = mean(wt) ) %>%
  ggplot( aes(x=am, y=weight, fill=cyl) ) +
  geom_bar(stat='identity')

我的问题是管道从 %>% 切换到 +。我知道这是一个非常轻微的痒,但我更愿意使用:

mtcars %>%
  group_by(am, cyl) %>%
  summarise( weight = mean(wt) ) %>%
  ggplot( aes(x=am, y=weight, fill=cyl) ) %>%
  geom_bar(stat='identity')

有没有一种方法可以修改 ggplot2 的行为,这样它就可以工作了?

ps。我不喜欢使用 magrittradd() 的想法,因为这再次使代码更难阅读。

因为在评论中展开太长了,根据你的回答,我不确定你是否尝试了我提供的代码但它没有工作,或者你之前尝试过但没有管理

geom_barw<-function(DF,x,y,fill,stat){
   require(ggplot2)
   p<-ggplot(DF,aes_string(x=x,y=y,fill=fill)) + geom_bar(stat=stat)
   return(p)
}
library(magrittr)
library(dplyr)
library(ggplot2)

mtcars %>%
group_by(cyl, am) %>%
summarise( weight = mean(wt) ) %>%
geom_barw(x='am', y='weight', fill='cyl', stat='identity')

这适用于我: dplyr_0.4.2 ggplot2_2.1.0 magrittr_1.5

当然 geom_barw 可以修改,这样您就不需要再使用引号了。

编辑lazy应该有更优雅和更安全的方式(参见lazyeval包),但一个非常快速的适应是使用 substitute (正如 Axeman 所指出的 - 但是没有 deparse 部分):

 geom_barw<-function(DF,x,y,fill,stat){
    require(ggplot2)

    x<-substitute(x)
    y<-substitute(y)
    fill<-substitute(fill)

    p<- ggplot(DF,aes_string(x=x,y=y,fill=fill))
    p<- p + geom_bar(stat=stat)
    return(p)
}