将字符串传递给facet_grid:ggplot2

Tyl*_*ker 20 r ggplot2

在ggplot2中,您可以使用在用户定义的函数内传递字符参数aes_string.对于采用公式的facet网格,你怎么能这样做aes呢?

FUN <- function(data, x, y, fac1, fac2) {
     ggplot(data = data, aes_string(x=x, y=y)) +
     geom_point() + facet_grid(as.formula(substitute(fac1 ~ fac2)))
}


FUN(mtcars, 'hp', 'mpg', 'cyl', 'am')
Run Code Online (Sandbox Code Playgroud)

Jos*_*ien 32

reformulate() 似乎工作得很好.

FUN <- function(data, x, y, fac1, fac2) {
      ggplot(data = data, aes_string(x=x, y=y)) +
      geom_point() + facet_grid(reformulate(fac2,fac1))
}

FUN(mtcars, 'hp', 'mpg', 'cyl', 'am')
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 如果你只想横向或纵向刻面,像`reformulate(fac1,".")`之类的东西也可以. (5认同)

Moo*_*per 6

借助rlang魔法和新ggplot2 v3.0.0功能,您可以做到:

FUN <- function(data, x, y, fac1, fac2) {
  ggplot(data = data, aes(x = !!ensym(x), y = !!ensym(y))) +
    geom_point() + 
    facet_grid(eval(expr(!!ensym(fac1) ~ !!ensym(fac2))))
}

FUN(mtcars, 'hp', 'mpg', 'cyl', 'am')
Run Code Online (Sandbox Code Playgroud)

请注意,我们不使用aes_string,它已被软弃用。

就我个人而言,在这些情况下,我喜欢使用我称为的函数glue_formula(引用 package glue):

glue_formula <- function(.formula, .envir = parent.frame(), ...){
  formula_chr <- gsub("\\n\\s*","",as.character(.formula)[c(2,1,3)])
  args <- c(as.list(formula_chr), .sep=" ", .envir = .envir)
  as.formula(do.call(glue::glue, args),env = .envir)
}

FUN2 <- function(data, x, y, fac1, fac2) {
  ggplot(data = data, aes(x = !!ensym(x), y = !!ensym(y))) +
    geom_point() + facet_grid(glue_formula({fac1} ~ {fac2}))
}

FUN2(mtcars, 'hp', 'mpg', 'cyl', 'am')
Run Code Online (Sandbox Code Playgroud)

它没有得到 tidyverse 的批准(请参阅此处有趣的讨论),但它对我很有帮助。

  • 感谢您的更新...没有敲响您的解决方案(尤其是胶水解决方案),但 `reformulate(fac2,fac1)` 看起来比 `eval(expr(!!ensym(fac1) ~ ! !ensym(fac2)))` (3认同)