使用 ggplot2 和 dplyr 进行编程 [英] Programming with ggplot2 and dplyr
问题描述
我想使用管道将 dplyr
和 ggplot
组合在一个函数中,现在正在努力解决一些问题.
这是第一个正在运行的简单方法.函数采用数据框并按指定的列和值进行过滤.
foo <- function(df, y, t = 4){tmp <-df%>%过滤器(!!enquo(y)> t)ggplot(tmp, aes_(substitute(y))) +geom_histogram()}foo(mtcars, cyl)
现在我试图直接通过管道连接到 ggplot 函数...给出一个错误
foo <- function(df, y, t=4){df%>%过滤器(!!enquo(y)> t)%>%ggplot(aes_(substitute(y))) +geom_histogram()}foo(mtcars, cyl)
<块引用>
FUN(X[[i]], ...) 中的错误:找不到对象 'cyl'另外: 警告信息:在 FUN(X[[i]], ...) 中:重新开始中断的承诺评估
还有最后一个.如何添加构面?
foo <- function(df, y, gr, t=4){df%>%过滤器(!!enquo(y)> t)%>%ggplot(aes_(substitute(y))) +geom_histogram() +facet_grid(~gr)}foo(mtcars, y= cyl, gr= vs)
编辑
第二个问题可以使用 aes_q
代替 aes_
解决 &替换
. (v0.2.0) 于 2018 年 4 月 4 日创建.
I want to combine dplyr
and ggplot
within one function using piping and struggling with some issues now.
Here is the first easy one which is working. Function which takes a dataframe and filters by a specified column and value.
foo <- function(df, y, t = 4){
tmp <- df %>%
filter(!!enquo(y) > t)
ggplot(tmp, aes_(substitute(y))) +
geom_histogram()
}
foo(mtcars, cyl)
Now I'm trying to pipe directly to the ggplot function...gives an error
foo <- function(df, y, t=4){
df %>%
filter(!!enquo(y) > t) %>%
ggplot(aes_(substitute(y))) +
geom_histogram()
}
foo(mtcars, cyl)
Error in FUN(X[[i]], ...) : object 'cyl' not found In addition: Warning message: In FUN(X[[i]], ...) : restarting interrupted promise evaluation
and the last one. How to add a facet?
foo <- function(df, y, gr, t=4){
df %>%
filter(!!enquo(y) > t) %>%
ggplot(aes_(substitute(y))) +
geom_histogram() +
facet_grid(~gr)
}
foo(mtcars, y= cyl, gr= vs)
Edit
The second issue can be solved using aes_q
instead of aes_
& substitute
. Source
foo <- function(df, y, gr, t=4){
y <- enquo(y)
df %>%
filter(!!y > t) %>%
ggplot(aes_q(y)) +
geom_histogram()
}
foo(mtcars, cyl)
Using ggplot2_2.2.1
ggplot2 v3.0.0
released in July 2018 supports !!
(bang bang), !!!
, and :=
.
facet_wrap()
and facet_grid()
support vars()
inputs. The first two arguments of facet_grid()
become rows
and cols
. facet_grid(vars(cyl), vars(am, vs))
is equivalent to facet_grid(cyl ~ am + vs)
and facet_grid(cols = vars(am, vs))
is equivalent to facet_grid(. ~ am + vs)
.
So your example can be modified as follow:
library(rlang)
library(tidyverse)
foo <- function(df, y, gr, t=4) {
y <- enquo(y)
gr <- enquo(gr)
df %>%
filter(!!y > t) %>%
ggplot(aes(!!y)) +
geom_histogram() +
facet_grid(cols = vars(!!gr))
}
foo(mtcars, y= cyl, gr= vs)
#> `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.
Created on 2018-04-04 by the reprex package (v0.2.0).
这篇关于使用 ggplot2 和 dplyr 进行编程的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!