管道 (%>%) ggplot2 像 ggvis
pipe (%>%) ggplot2 like ggvis
当我使用 knitr
将表格和图形集成到文档中时,添加代码使其更易于重现和有趣。
通常 dplyr
和 ggvis
的组合可以使绘图具有相对清晰的代码(使用 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。我不喜欢使用 magrittr
的 add()
的想法,因为这再次使代码更难阅读。
因为在评论中展开太长了,根据你的回答,我不确定你是否尝试了我提供的代码但它没有工作,或者你之前尝试过但没有管理
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)
}
当我使用 knitr
将表格和图形集成到文档中时,添加代码使其更易于重现和有趣。
通常 dplyr
和 ggvis
的组合可以使绘图具有相对清晰的代码(使用 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。我不喜欢使用 magrittr
的 add()
的想法,因为这再次使代码更难阅读。
因为在评论中展开太长了,根据你的回答,我不确定你是否尝试了我提供的代码但它没有工作,或者你之前尝试过但没有管理
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)
}