R语言 使用ggplot2的条件面规范

4sup72z8  于 2023-03-15  发布在  其他
关注(0)|答案(2)|浏览(138)

我正在制作几个图,为了灵活起见,我计划用函数来 Package ,作为其中的一部分,我想根据某些条件为这些图指定小面。
具体来说,我有一个grouping_vars的列表(在其他地方指定),我用它来执行其他一些数据操作。如果只有一个grouping_var,我希望我的绘图函数能够自动使用facet_wrap,或者如果在grouping_var中指定了两个或更多变量,则对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))

基于一些otheranswers,我尝试过这样做:

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
有没有一种方法可以像这样有条件地指定镶嵌面?

mbskvtky

mbskvtky1#

按照小插图here中的建议,我们应该能够将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 package(v2.0.0)于2023年3月14日创建

lokaqttq

lokaqttq2#

我们可以创建一个自定义函数,该函数使用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 package(v2.0.1)于2023年3月14日创建

相关问题