自定义函数中的for循环以创建ggplot时间序列图

时间:2018-08-27 18:03:42

标签: r function for-loop ggplot2

我很难创建带有for循环的函数,该循环将数据框中的列作为数据并根据列名创建不同的图。我已经阅读了SO上的多个相关问题,例,   1Creating function to use loops with ggplot2 [2]:Looping over variables in ggplot 但到目前为止,对我来说没有任何效果。

样本数据:

<table>
  <tr>
    <th>Athlete</th>
    <th>Seconds</th>
    <th>Advance</th>
  </tr>
  <tr>
    <td>A.E.</td>
    <td>120</td>
    <td class="advance">.</td>
  </tr>
  <tr>
    <td>G.F.</td>
    <td>90</td>
    <td class="advance">.</td>
  </tr>
  <tr>
    <td>T.L</td>
    <td>110</td>
    <td class="advance">.</td>
  </tr>
</table>
<input type="number">
<button id="btn">
        Confirm
        </button>

我尝试过的不同代码:

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) } aes()Error: Mapping should be created with aes_()。当我运行第二个函数时,我会得到一条相同的图,并用一条水平线一遍又一遍地绘制图,然后尝试了更多的方法,但出于最小的目的,我将展示这两个图。我想为每个列创建一个时间序列图,如下所示: enter image description here

2 个答案:

答案 0 :(得分:2)

以下作品。
您正在沿 all 列循环,其中包括列"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)

答案 1 :(得分:1)

使用cv2.IMREAD_UNCHANGEDtidyeval方法的解决方案,需要this answer

  • 首先,我们构建一个将x-和y-列作为输入的函数。请注意rlang::symrlang::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))

ggplot2 v3.0.0(v0.2.0.9000)创建于2018-08-27。