Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
461 views
in Technique[技术] by (71.8m points)

r - for loop within custom function to create ggplot time series plots

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 through multiple different related questions on SO, for example, 1: Creating function to use loops with ggplot2 [2]: Looping over variables in ggplot but nothing has worked for me so far.

Sample Data:

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

Different Codes I have tried:

Plot_Graph<-function(x,na.rm=T){
  nm=names(x)
  for (i in seq_along(nm)) {
    print(ggplot(x,aes_string(x="DATE",y=i) +
            geom_point()))
                                      }
  }

Plot_Graph(philly_df_new)
colNames <- names(philly_df_new)[2:4]
for(i in seq_along(colNames)){
  plt <- ggplot(philly_df_new, aes_string(x="DATE", y = i)) +
    geom_point(color="#B20000", size=3, alpha=0.5,na.rm = T) 
  print(plt)
}

When I run the first function I get this error message Error: Mapping should be created withaes()oraes_(). When I run the second function I get a plot with the same plot over and over with a horizontal line.I have tried more ways then this but for minimal purposes I'll show those two. I want to create a time series plot for each column like this: enter image description here

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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)

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...