在时间序列降雨数据上创建循环

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在时间序列降雨数据上创建循环相关的知识,希望对你有一定的参考价值。

我是R.的新手。我已经编写了这个代码来生成highcharter库,这是基于我有11年的数据帧,即2005年 - 2011年(4月 - 10月)

以下代码为期一年。我想创建一个循环或类似的东西,分别为每年创建图表。此代码工作正常,但我必须手动更改每年的日期并生成图表。

Year_2005_rain <- subset(Seven, 
                         time >= as.Date('2005-04-01') & 
                         time <= as.Date('2005-10-31'))
Year_2005_flow<- subset(Seven_flow, 
                        time >= as.Date('2005-04-01') & 
                        time <= as.Date('2005-10-31'))
Year_2005_inflow<- subset(Seven_inflow, 
                          time >= as.Date('2005-04-01') & 
                          time <= as.Date('2005-10-31'))

merge1_05 <- merge(Year_2005_rain,
                   Year_2005_flow,
                   Year_2005_inflow, by="time")

names(Year_2005_rain) <- names(Year_2005_flow) <- names(Year_2005_inflow)
merge1_05 <- rbind(Year_2005_rain, Year_2005_flow,Year_2005_inflow)

colnames(merge1_05)[colnames(merge1_05)=="time"] <- "date"
colnames(merge1_05)[colnames(merge1_05)=="Discharge"] <- "value"

merge1_05$date = as.Date(merge1_05$date, format = "%Y/%m/%d")    
merge1_05$variable <- c(rep("rain", 214), rep("discharge", 214), rep("inflow", 214))

hc_14<- highchart() %>% 
  hc_yAxis_multiples(list(title = list(text = "rainfall depth (mm)"), reversed = TRUE), 
                     list(title = list(text = "flow (m3/s)"), opposite = TRUE)) %>% 
  hc_add_series(data = filter(merge1_05, variable == "rain") %>% 
                mutate(value = value) %>% .$value, type = "column") %>% 
  hc_add_series(data = filter(merge1_05, variable == "discharge") %>% .$value,   
                type = "spline", yAxis = 1) %>%
  hc_add_series(data = filter(merge1_05, variable == "inflow") %>% .$value,  
                type = "spline", yAxis = 1) %>%
  hc_xAxis(categories = merge1_05$date, title = list(text = "date"))

hc_14
答案

这些代码适用于我的电脑。请将数据文件放在R脚本的同一文件夹中。

# import data and library
library(ggplot2)
library(dplyr)
library(highcharter)

Seven_flow = read.csv("Seven_flow.csv")
Seven_inflow = read.csv("Seven_inflow.csv")
Seven = read.csv("Seven.csv")

# cleanning data.
# put all the data into one dataframe. 
# add a column year as the iter in for loop.
hydrograph = Seven_flow
names(hydrograph) = c("X","date", "discharge")
hydrograph$inflow = Seven_inflow$value
hydrograph$rain = Seven$value
hydrograph$date = as.Date(hydrograph$date, format = "%Y-%m-%d")
hydrograph$year = format(hydrograph$date, "%Y")
summary(hydrograph)

# plot the data in for loop.

for (year.plot in seq(2005,2011,1)){
  # filter the year of interest.
  hydrograph.plot = filter(hydrograph, year==year.plot)

hc_14<- highchart() %>% 
hc_yAxis_multiples(list(title = list(text = "rainfall depth (mm)"), reversed   
= TRUE), list(title = list(text = "flow (m3/s)"), opposite = TRUE)) %>% 
hc_add_series(data = hydrograph.plot$rain , type = "column") %>% 
hc_add_series(data = hydrograph.plot$discharge, type = "spline", yAxis = 1) %>%
hc_add_series(data = hydrograph.plot$inflow,  type = "spline", yAxis = 1) %>%
hc_xAxis(categories = hydrograph.plot$date, title = list(text = "date"))

print(hc_14)}
另一答案

只需将处理概括为已定义的函数,其中将年份整数作为参数传递。所需要的只是动态地将yr参数与paste0()连接到as.Date调用,并删除任何_05后缀以避免混淆:

功能

build_graph <- function(yr) {    
    Year_rain <- subset(Seven, 
                        time >= as.Date(paste0(yr,'-04-01')) & 
                        time <= as.Date(paste0(yr,'-10-31')))
    Year_flow<- subset(Seven_flow, 
                       time >= as.Date(paste0(yr,'-04-01')) & 
                       time <= as.Date(paste0(yr,'-10-31')))
    Year_inflow<- subset(Seven_inflow, 
                         time >= as.Date(paste0(yr,'-04-01')) & 
                         time <= as.Date(paste0(yr,'-10-31')))

    merge1 <- merge(Year_rain, Year_flow, Year_inflow, by="time")    
    names(Year_rain) <- names(Year_flow) <- names(Year_inflow)
    merge1 <- rbind(Year_rain, Year_flow,Year_inflow)

    colnames(merge1)[colnames(merge1)=="time"] <- "date"
    colnames(merge1)[colnames(merge1)=="Discharge"] <- "value"

    merge1$date <- as.Date(merge1$date, format = "%Y/%m/%d")    
    merge1$variable <- c(rep("rain", 214), rep("discharge", 214), rep("inflow", 214))

    hc_14 <- highchart() %>% 
      hc_yAxis_multiples(list(title = list(text = "rainfall depth (mm)"), reversed=TRUE),
                         list(title = list(text = "flow (m3/s)"), opposite = TRUE)) %>% 
      hc_add_series(data = filter(merge1, variable == "rain") %>% 
                      mutate(value = value) %>% .$value, type = "column") %>% 
      hc_add_series(data = filter(merge1, variable == "discharge") %>% .$value, 
                    type = "spline", yAxis = 1) %>%
      hc_add_series(data = filter(merge1, variable == "inflow") %>% .$value,  
                    type = "spline", yAxis = 1) %>%
      hc_xAxis(categories = merge1$date, title = list(text = "date"))

    return(hc_14)
})

迭代

# OUTPUT TO CONSOLE (NO SAVING)
for (i in 2005:2011) {
   build_graph(i)
}

# SAVING OUTPUTS TO LIST
output_list <- lapply(2005:2011, build_graph)

以上是关于在时间序列降雨数据上创建循环的主要内容,如果未能解决你的问题,请参考以下文章

如何在循环中创建频道?

创建自己的代码片段(CodeSnippet)

如何使用数组 C# 将每月降雨量输出为“*”?

常用python日期日志获取内容循环的代码片段

如何使用光标和循环显示来自 sqlite 的片段的 recyclerview

实时matplotlib图在循环中不起作用[重复]