r - 如何将 ggplot 和 dplyr 组合成一个函数?

标签 r ggplot2 dplyr tidyeval

考虑这个简单的例子

library(dplyr)
library(ggplot2)

dataframe <- data_frame(id = c(1,2,3,4),
                        group = c('a','b','c','c'),
                        value = c(200,400,120,300))

# A tibble: 4 x 3
     id group value
  <dbl> <chr> <dbl>
1     1     a   200
2     2     b   400
3     3     c   120
4     4     c   300

在这里,我想编写一个将数据帧和分组变量作为输入的函数。理想情况下,在分组和聚合后,我想打印一个 ggpplot图表。

这有效:
get_charts2 <- function(data, mygroup){

  quo_var <- enquo(mygroup)

  df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE),
              count = n()) %>% 
    ungroup()

  df_agg
}



> get_charts2(dataframe, group)
# A tibble: 3 x 3
  group  mean count
  <chr> <dbl> <int>
1     a   200     1
2     b   400     1
3     c   210     2

不幸的是,添加 ggplot进入上面的函数失败
 get_charts1 <- function(data, mygroup){

  quo_var <- enquo(mygroup)

  df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE),
              count = n()) %>% 
  ungroup()

  ggplot(df_agg, aes(x = count, y = mean, color = !!quo_var, group = !!quo_var)) + 
    geom_point() +
    geom_line() 
}


> get_charts1(dataframe, group)
Error in !quo_var : invalid argument type

我不明白这里有什么问题。有任何想法吗?
谢谢!

编辑:这里有趣的后续how to create factor variables from quosures in functions using ggplot and dplyr?

最佳答案

ggplot尚不支持 tidy eval 语法(您不能使用 !! )。您需要使用更传统的标准评估调用。您可以使用 aes_q在 ggplot 中帮助解决这个问题。

get_charts1 <- function(data, mygroup){

  quo_var <- enquo(mygroup)

  df_agg <- data %>% 
    group_by(!!quo_var) %>% 
    summarize(mean = mean(value, na.rm = TRUE),
              count = n()) %>% 
    ungroup()

  ggplot(df_agg, aes_q(x = quote(count), y = quote(mean), color = quo_var, group = quo_var)) + 
    geom_point() +
    geom_line() 
}


get_charts1(dataframe, group)

关于r - 如何将 ggplot 和 dplyr 组合成一个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45824409/

相关文章:

r - 如何在 R 中制作时间序列箱线图

r - 在R dplyr中,为什么扩展函数后面有一个单引号?

r - R 函数中的 Magrittr 管道

r - GTrendsR + ggplot2?

r - 有没有办法在 R Shiny 中强制限制 rhandsontable 的字符数?

r - 在 ggplot2 中的条之间添加空间

r - 将 geom_text 与 ggplot2 中的 geom_vline 对齐

sql - 找出 dplyr 查询中有多少行的最快方法是什么?

r - 与基于多个非唯一列的替换合并

r - 将数字分成 0-1 之间的等间隔区间