【问题标题】:pass string to facet_grid : ggplot2将字符串传递给 facet_grid:ggplot2
【发布时间】:2014-02-05 20:44:29
【问题描述】:

在 ggplot2 中,您可以使用 aes_string 在用户定义的函数中传递字符参数。对于采用公式而不是 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')

【问题讨论】:

  • as.formula(paste(fac1,"~", fac2))

标签: r ggplot2


【解决方案1】:

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

【讨论】:

  • 完美。不知道reformulate
  • 如果你只想水平或垂直切面,reformulate(fac1, ".") 之类的也可以。
【解决方案2】:

使用 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')

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

在这些情况下,我个人喜欢使用我称为glue_formula(引用包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')

它没有被 tidyverse 批准 (see interesting discussion here),但它对我很有帮助。

【讨论】:

  • 感谢您的更新...不要敲你的解决方案(尤其是胶水解决方案),但reformulate(fac2,fac1) 似乎比eval(expr(!!ensym(fac1) ~ !!ensym(fac2))) 更简洁、更容易推理
  • 我同意,但它更灵活,以防您有更复杂的公式(可能与 facet_grid 无关),它来自 Lionel。 github issue 还没有结束,所以他们可能会想出更令人满意的东西。
猜你喜欢
  • 2012-06-13
  • 2020-04-08
  • 2016-06-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多