цикл for в пользовательской функции для создания графиков временных рядов ggplot - PullRequest
0 голосов
/ 27 августа 2018

Я с трудом пытаюсь создать функцию с циклом for, которая берет столбцы в фрейме данных и создает разные графики на основе имени столбца. Я прочитал несколько разных связанных вопросов по SO, для пример, 1 : Создание функции для использования циклов с ggplot2 [2]: Зацикливание переменных в ggplot но пока у меня ничего не получалось.

Пример данных:

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

Различные коды, которые я пробовал:

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

Когда я запускаю первую функцию, я получаю это сообщение об ошибке Error: Mapping should be created with АЕС () or aes_ (). Когда я запускаю вторую функцию, я получаю график с одним и тем же графиком снова и снова с горизонтальной линией. Я попробовал больше способов, чем это, но для минимальных целей я покажу эти два. Я хочу создать график временных рядов для каждого столбца следующим образом: enter image description here

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Решение, использующее tidyeval подход, аналогичный этому ответу , для которого требуется ggplot2 v3.0.0

  • Сначала мы создаем функцию, которая принимает x- и y-столбцы в качестве входных данных. Обратите внимание на использование rlang::sym, rlang::quo_name & !!.

  • Затем мы можем перебрать каждый столбец, используя 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)
}

Теперь перебрать все столбцы

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

Создано в 2018-08-27 пакетом представ (v0.2.0.9000).

0 голосов
/ 27 августа 2018

Следующие работы.
Вы проходили по всем столбцам, включая столбец "DATE", который должен быть осью x, а переменная цикла была целым числом, поэтому в эстетике графика y = i было целым числом, а не именем столбца.

Обратите внимание, что я звоню windows(), чтобы открыть новое графическое окно. Удалите это, если не нужно.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...