How to combine ggplot and dplyr into a function?

后端 未结 2 1443
没有蜡笔的小新
没有蜡笔的小新 2020-12-03 11:37

Consider this simple example

library(dplyr)
library(ggplot2)

dataframe <- data_frame(id = c(1,2,3,4),
                        group = c(\'a\',\'b\',\'c\'         


        
相关标签:
2条回答
  • 2020-12-03 12:08

    ggplot2 v3.0.0 released in July 2018 supports !! (bang bang), !!!, and :=. aes_()/aes_q() and aes_string() are soft-deprecated.

    OP's original code should work

    library(tidyverse)
    
    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)
    

    Edit: using the tidy evaluation pronoun .data[] to slice the chosen variable from the data frame also works

    get_charts2 <- function(data, mygroup){
    
      df_agg <- data %>% 
        group_by(.data[[mygroup]]) %>% 
        summarize(mean = mean(value, na.rm = TRUE),
                  count = n()) %>% 
        ungroup()
    
      ggplot(df_agg, aes(x = count, y = mean, 
                         color = .data[[mygroup]], group = .data[[mygroup]])) + 
        geom_point() +
        geom_line() 
    }
    
    get_charts2(dataframe, "group")
    

    Created on 2018-04-04 by the reprex package (v0.2.0).

    0 讨论(0)
  • 2020-12-03 12:09

    ggplot does not yet support tidy eval syntax (you can't use the !!). You need to use more traditional standard evaluation calls. You can use aes_q in ggplot to help with this.

    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)
    
    0 讨论(0)
提交回复
热议问题