使用ggplot2进行条件分面规范

3

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

具体来说,我有一个grouping_vars列表(在其他地方预先指定),我使用它对数据执行几项操作。如果只有一个grouping_var,我希望我的绘图函数能够自动使用facet_wrap,或者如果指定了两个或更多变量,则使用前两个进行facet_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_vars中只有一个元素,会出现Error in grouping_vars[[2]] : subscript out of bounds等错误提示。

有没有一种有条件指定分面的方法呢?

2个回答

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")

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

2023年3月14日使用reprex package(v2.0.0)创建


3
我们可以创建一个自定义函数,使用get将变量传递给ggplot
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)

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接