ggplot2 的条件构面规范

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.

有没有办法像这样有条件地指定分面?

teu*_*and 5

按照此处小插图中的建议,我们应该能够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)