TY *_*Lim 3 r parameter-passing facet ggplot2 facet-wrap
我正在制作几个图,为了灵活性,我计划将其包装在函数中,作为其中的一部分,我想根据某些条件为这些图指定分面。
具体来说,我有一个列表grouping_vars(在其他地方指定),用于对数据执行其他一些操作。我希望我的绘图函数能够facet_wrap在只有一个时自动使用 a grouping_var,或者如果 中指定了两个或多个变量grouping_var,则使用前两个 for facet_grid。
例如,如果基本情节是这样的
mtcars %>% ggplot() + geom_point(aes(x = hp, y = mpg))
Run Code Online (Sandbox Code Playgroud)
如果我指定grouping_vars <- c("cyl"),我实际上想得到,
mtcars %>% ggplot() +
geom_point(aes(x = hp, y = mpg)) +
facet_wrap(~cyl)
Run Code Online (Sandbox Code Playgroud)
而如果我指定grouping_vars <- c("cyl", "carb")我想得到
mtcars %>% ggplot() +
geom_point(aes(x = hp, y = mpg)) +
facet_grid(vars(cyl), vars(carb))
Run Code Online (Sandbox Code Playgroud)
mtcars %>% ggplot() +
geom_point(aes(x = hp, y = mpg)) +
{if(length(grouping_vars==1)) facet_wrap(grouping_vars[[1]])} +
{if(length(grouping_vars>=2)) facet_grid(vars(grouping_vars[[1]]), vars(grouping_vars[[2]]))}
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用。除此之外,如果 中只有一个元素grouping_vars,它会给我Error in grouping_vars[[2]] : subscript out of bounds.
有没有办法像这样有条件地指定分面?
按照此处小插图中的建议,我们应该能够vars()与.data代词一起使用,如下所示:
library(ggplot2)
plot_mtcars <- function(grouping_vars = NULL) {
p <- ggplot(mtcars) +
geom_point(aes(x = hp, y = mpg))
if (length(grouping_vars) == 1) {
p <- p + facet_wrap(vars(.data[[grouping_vars]]))
} else if (length(grouping_vars) == 2) {
p <- p + facet_grid(vars(.data[[grouping_vars[1]]]),
vars(.data[[grouping_vars[2]]]))
}
p
}
plot_mtcars("cyl")
Run Code Online (Sandbox Code Playgroud)

plot_mtcars(c("cyl", "vs"))
Run Code Online (Sandbox Code Playgroud)

由reprex 包于 2023 年 3 月 14 日创建(v2.0.0)