使用 ggplot2 的条件分面规范

Conditional facet specification with ggplot2

提问人:TY Lim 提问时间:3/14/2023 最后编辑:M--TY Lim 更新时间:3/14/2023 访问量:72

问:

我正在制作几个图,为了灵活起见,我计划将其包装在函数中,作为其中的一部分,我想根据某些条件为这些图指定分面。

具体来说,我有一个列表(在其他地方指定),我用它来对数据执行其他几个操作。我希望我的绘图函数能够自动使用 如果只有一个 ,或者如果 中指定了两个或多个变量,则使用前两个变量。grouping_varsfacet_wrapgrouping_vargrouping_varfacet_grid

例如,如果基本情节是这样的

mtcars %>% ggplot() + geom_point(aes(x = hp, y = mpg))

如果我指定 ,我想得到,实际上,grouping_vars <- c("cyl")

mtcars %>% ggplot() + 
    geom_point(aes(x = hp, y = mpg)) +
    facet_wrap(~cyl)

而如果我指定,我想得到grouping_vars <- c("cyl", "carb")

mtcars %>% ggplot() + 
    geom_point(aes(x = hp, y = mpg)) +
    facet_grid(vars(cyl), vars(carb))

根据其他一些答案,我尝试这样做:

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]]))}

但它似乎不起作用。除其他外,如果 中只有一个元素,它给了我 .grouping_varsError in grouping_vars[[2]] : subscript out of bounds

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

r ggplot2 参数传递 facet facet-wrap

评论


答:

5赞 teunbrand 3/14/2023 #1

按照这里小插曲中的建议,我们应该能够按如下方式使用代词: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")

plot_mtcars(c("cyl", "vs"))

reprex 软件包 (v2.0.0) 于 2023-03-14 创建

3赞 M-- 3/14/2023 #2

我们可以创建一个自定义函数,用于将变量传递给 。getggplot

conditional_facet <- function(data, x, y, grp) {
  require(ggplot2)
  require(dplyr)
  data %>% 
    ggplot() + 
    geom_point(aes({{x}}, {{y}})) -> gp
  
  if(length(grp) == 1) {
    gp + facet_wrap(~get(grp)) -> gp_out
  } else if (length(grp) == 2) {
    gp + facet_grid(vars(get(grp[1])), vars(get(grp[2]))) -> gp_out
  } else {
    gp -> gp_out
  }
  return(gp_out)
}
grouping_vars <- c("cyl")
conditional_facet(mtcars, hp, mpg, grouping_vars)

grouping_vars <- c("cyl", "carb")
conditional_facet(mtcars, hp, mpg, grouping_vars)

创建于 2023-03-14 通过 reprex 包 (v2.0.1)