for loop within custom function to create ggplot time series plots

前端 未结 2 492
一整个雨季
一整个雨季 2020-12-12 02:33

I\'m having a hard time trying to create a function with a for loop that takes the columns in a data frame and creates different plots based on the column name.. I have read

相关标签:
2条回答
  • 2020-12-12 02:46

    A solution using tidyeval approach similar to this answer which requires ggplot2 v3.0.0

    • First we build a function that takes x- & y- columns as inputs. Note the use of rlang::sym, rlang::quo_name & !!.

    • Then we can loop through every column using purrr::map.

    library(rlang)
    library(tidyverse)
    
    philly_df_new <- structure(list(DATE = structure(c(14610, 14611, 14612, 14613, 
        14614, 14615, 14616, 14617, 14618, 14619, 14620, 14621, 14622, 
        14623, 14624, 14625, 14626, 14627, 14628, 14629), class = "Date"), 
            HOURLYDewPointTempC = c(0, -8.9, -15, -12.2, -11.7, -10.6, 
            -8.3, -4.4, -12.2, -17.2, -12.8, -6.1, -10.6, -7.8, -5.6, 
            -2.2, 0.6, 3.9, 0.6, -3.3), HOURLYSeaLevelPressure = c(30, 
            29.79, 29.78, 29.76, 29.81, 29.78, 29.89, 29.87, 29.98, 30.25, 
            30.27, 30.13, 30.22, 30.23, 30.21, 30.23, 30.14, 29.49, 29.95, 
            29.92), DAILYDeptFromNormalAverageTemp = c(-1.7, 2.4, -6.4, 
            -10.3, -6.2, -5.1, -1, -1, -5.9, -10.8, -11.8, -9.7, -3.7, 
            -1.7, -1.6, 4.4, 4.4, 6.4, 8.4, 4.3)), .Names = c("DATE", 
        "HOURLYDewPointTempC", "HOURLYSeaLevelPressure", "DAILYDeptFromNormalAverageTemp"
        ), row.names = c(NA, -20L), class = c("tbl_df", "tbl", "data.frame"
        ))
    
    # define a function that accept strings as input
    Plot_Graph <- function(df, x_var, y_var) {
    
      # convert strings to variable
      x_var <- rlang::sym(x_var)
      y_var <- rlang::sym(y_var)
    
      # unquote variable using !! 
      ggplot(df, aes(x = !! x_var, y = !! y_var)) + 
        geom_point() + 
        geom_line() +
        labs(x = rlang::quo_name(x_var), y = rlang::quo_name(y_var)) +
        scale_x_date(breaks = scales::pretty_breaks()) +
        theme_classic(base_size = 12)
    }
    

    Now loop through every column

    plot_list <- colnames(philly_df_new)[-1] %>% 
      map( ~ Plot_Graph(philly_df_new, "DATE", .x))
    
    plot_list
    #> [[1]]
    

    #> 
    #> [[2]]
    

    #> 
    #> [[3]]
    

    # Combine all plots
    library(cowplot)
    
    do.call(plot_grid, c(plot_list, 
                         align = "v",
                         axis = 'lr',
                         nrow = 3))
    

    Created on 2018-08-27 by the reprex package (v0.2.0.9000).

    0 讨论(0)
  • 2020-12-12 02:49

    The following works.
    You were looping along all columns including column "DATE", which is supposed to be the x axis and the loop variable was integer so in the plot's aesthetic y = i was an integer, not a column name.

    Note that I call windows() to open a new graphic window. Remove this if not needed.

    Plot_Graph <- function(DF, na.rm = TRUE){
      nm = names(DF)[-1]
      for (i in nm) {
        g <- ggplot(DF, aes(x = DATE, y = get(i))) +
                geom_point()
        windows()
        print(g)
      }
    }
    
    Plot_Graph(philly_df_new)
    
    0 讨论(0)
提交回复
热议问题