【问题标题】:Use dplyr SE with ggplot2将 dplyr SE 与 ggplot2 一起使用
【发布时间】:2017-12-29 23:06:12
【问题描述】:

我经常在包装函数中将dplyrggplot2 结合起来进行分析。当我使用tidyeval 迁移到 v.0.7.1 的新 NSE / SE 范例时,我正在努力让这种组合发挥作用。我发现ggplot 不理解未引用的quosers(还)。以下方法不起作用:

example_func <- function(col) {
  col <- enquo(col)
  mtcars %>% count(!!col) %>% 
    ggplot(aes((!!col), n)) +
    geom_bar(stat = "identity")
}
example_func(cyl)
# Error in !col : invalid argument type

我目前使用以下解决方法。但我认为一定有更好的方法。

example_func2 <- function(col) {
  col <- enquo(col)
  mtcars %>% count(!!col) %>% 
    ggplot(aes_string(rlang::quo_text(col), "n")) +
    geom_bar(stat = "identity")
}

请告诉我将这两者结合起来的最佳方式。谢谢!

【问题讨论】:

  • 如果是字符串,需要aes_string,那是什么问题?
  • 感觉绕了一大圈,先引用,然后用quo_text,再用aes_string。希望有更直接的解决方案。
  • 然而,这个 seems to be the way to go 在使用 tidyeval 时。

标签: r ggplot2 dplyr


【解决方案1】:

如果您已经在处理 quosures,则使用 aes_ 会更容易,它接受引用为公式的输入:aes_(col, ~n)

这段代码解决了你的问题:

library(tidyverse)
example_func <- function(col) {
  col <- enquo(col)
  mtcars %>% count(!!col) %>% 
    ggplot(aes_(col, ~n)) +
    geom_bar(stat = "identity")
}

example_func(cyl)

【讨论】:

    【解决方案2】:

    似乎有两种思考方式。

    方法 1:关注点分离。

    我喜欢我的阴谋与我的争吵的东西非常分开。此外,您可以命名您的组,这感觉是解决问题的最简单方法[尽管您确实丢失了原始列名]。因此,解决您想要做的事情的一种方法可以通过;

    library(tidyverse)
    
    concern1_data <- function(df, col) {
      group <- enquo(col)
      df %>% 
        group_by(group = !!group) %>% 
        summarise(n = n())
    }
    
    concern2_plotting <- function(df){
      ggplot(data=df) +
        geom_bar(aes(group, n), stat = "identity")
    }
    
    mtcars %>% 
      concern1_data(am) %>% 
      concern2_plotting()
    

    这或多或少地实现了您想要做的事情,并将关注点分开(值得一提)。

    方法 2:接受并等待

    问题是:tidyeval 尚未在 ggplot2 中实现。 - 科林费from link

    我认为这是目前 ggplot2 中没有的支持,但我无法想象 ggplot2 不会获得此功能。只是还没有。

    【讨论】:

    • 我发现 tidyeval 确实很快就会出现在 ggplot 上。我喜欢你的两步方法,在这个例子中唯一的缺点是你失去了情节上的列名,但这当然很容易解决。
    猜你喜欢
    • 2021-01-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2015-03-16
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多