vlambda博客
学习文章列表

R语言绘制时间序列数据

通过一系列时间点上的观测来获取数据是司空见惯的活动。在商业上,我们会观测到周利率、日股票闭盘价、月价格指数、年销售量等,在气象上,我们会观测到每天的最高温度和最低温度、年降水、污染物含量等数据。时间序列分析的目的一般有两个方面:一是认识产生观测序列的随机机制,即建立数据生成模型;二是基于序列的历史数据,也许还要考虑其他相关序列或因素,对序列未来可能取值给出预测或预报。
本文简单介绍一下基于R语言绘制一些时间序列数据,希望可以给刚刚接触时间序列应用的朋友一点点帮助。
01
基于ggplot2绘制时间序列图

#加载分析所需要的包

library(TSA)

library(zoo)

library(lubridate)

#读取并清洗数据

data <- read.csv("data1.csv", header=F)

data <- data[9:4008,]

data <- data.frame(data)

names(data) <- c("time", "OMI_value")

data$OMI_value <- as.character(data$OMI_value)

options(scipen = 3)

data$OMI_value <- as.numeric(data$OMI_value)

#将数据框数据转化为时间序列

data_time <- zoo(data$OMI_value, as.Date(as.character(data$time), format='%Y/%m/%d'))

#查看数据

head(data_time)

#清洗时间序列数据

data_time1 <- data_time[-which(data_time<0),]

data_time1 <- na.omit(data_time1)

#绘制时间序列图

#画图前将时间序列转换为数据框数据

a <- data.frame(Time=c(time(data_time1)),OMI_value=c(data_time1))

p <- ggplot(a,aes(x=Time,y=OMI_value))

p1 <- p + geom_line(colour = 'blue') +

    geom_point(size=0.8, color = "red") + labs(x='year', y='tropospheric NO2 VCD (molecules/cm2)', 

    title="The variation per day tropospheric NO2 VCD in china from 2009 to 2019")

#调整绘图外观

axis_theme<-theme(

  axis.title.x=element_text(colour="#36648B"),#x轴标题设置,优先级高于axis.title

  axis.title.y=element_text(colour="#36648B"),#同上

  axis.text=element_text(colour="#36648B"),#设置坐标轴刻度数字

  axis.ticks=element_line(#坐标轴刻度线的设置

  colour="#36648B",

  size=1.5,

  linetype=1,

  lineend=1),

  axis.ticks.length=unit(.4,"lines"),#设置刻度线的高度

  axis.line=element_line(#设置轴线

    colour="#36648B"))

p2 <- p1+axis_theme

p3 <- p2 + theme(plot.title = element_text(colour = "black", face = "bold", size = 20, vjust = 1))    

p4 <- p3+theme(panel.grid.minor = element_blank(),panel.background = element_blank(), panel.grid.major.y = element_line(colour='gray',linetype=3))

p4

R语言绘制时间序列数据


02
基于ggplot2绘制月平均值时间序列图

#创建空数据框

re <- data.frame(year = numeric(), month = numeric(), mean = numeric(), sd = numeric(), se = numeric())

#自定义计算指定年份和月份的时间序列平均值、标准差和标准误

time_summary <- function(time_data, year, month){

    data_year <- time_data[which(year(time_data) == year & month(time_data) == month),]

    res1 <- mean(data_year)

    res2 <- sd(data_year)

    res3 <- res2/sqrt(length(data_year))

    result <- data.frame(year = year, month = month, mean=res1, sd=res2, se=res3)

    return(result)

}

#基于for循环计算2009到2019年每月的数据,结果储存在新建的空数据框里面

for(year in 2009:2019){

    for(month in 1:12){

       res_year <- time_summary(data_time1,year,month)    

       re[month+(year-2009)*12,] <- res_year 

       }

   }

re

#基于ggplot2绘制分面图

p <- ggplot(re, aes(x=month, y=mean)) + 

geom_errorbar(aes(ymin=mean-se, ymax=mean+se), width=.1, size=0.8, color = 4) +geom_line(size=0.8, color = 4) +geom_point(size=0.8, color = 4) + labs(x='year', y='tropospheric NO2 VCD (molecules/cm2)', title="The variation of monthly mean tropospheric NO2 VCD in china from 2009 to 2019")+ facet_wrap( ~ year, ncol=3)

#设置绘图横坐标标签

lab <-rep(c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"),11)

p1 <- p + scale_x_continuous(breaks=re$month, labels = lab)

#调整绘图格式

axis_theme<-theme(

  axis.title.x=element_text(colour="#36648B"),#x轴标题设置,优先级高于axis.title

  axis.title.y=element_text(colour="#36648B"),#同上

  axis.text=element_text(colour="#36648B"),#设置坐标轴刻度数字

  axis.ticks=element_line(#坐标轴刻度线的设置

  colour="#36648B",

  size=1.5,

  linetype=1,

  lineend=1),

  axis.ticks.length=unit(.4,"lines"),#设置刻度线的高度

  axis.line=element_line(#设置轴线

    colour="#36648B"))

p2 <- p1+axis_theme

p3 <- p2 + theme(plot.title = element_text(colour = "black", face = "bold", size = 20, vjust = 1))    

p4 <- p3+theme(panel.grid.minor = element_blank(),panel.background = element_blank(), panel.grid.major.y = element_line(colour='gray',linetype=3))


03
基于ggplot2绘制年平均值时间序列图

#创建空数据框

re <- data.frame(year = numeric(), mean = numeric(), sd = numeric(), se = numeric())

#自定义计算指定年份和月份的时间序列平均值、标准差和标准误

time_summary <- function(time_data, year){

    data_year <- time_data[which(year(time_data) == year),]

    res1 <- mean(data_year)

    res2 <- sd(data_year)

    res3 <- res2/sqrt(length(data_year))

    result <- data.frame(year = year, mean=res1, sd=res2, se=res3)

    return(result)

}

#基于for循环计算2009到2019年平均数据,结果储存在新建的空数据框里面

for(year in 2009:2019){

       res_year <- time_summary(data_time1,year)    

       re[year-2008,] <- res_year 

   }

#基于ggplot2绘制具有拟合曲线的折线图

p <- ggplot(re, aes(x=year, y=mean)) + 

geom_errorbar(aes(ymin=mean-se, ymax=mean+se), width=.1, size=0.8, color = 4) +geom_line(size=0.8, color = 4) +geom_point(size=0.8, color = 4) + labs(x='year', y='tropospheric NO2 VCD (molecules/cm2)', title="The variation of annual mean tropospheric NO2 VCD in china from 2009 to 2019")+geom_smooth(method="lm")

#设置绘图横坐标标签

p1 <- p + scale_x_continuous(breaks=re$year, labels = c(2009:2019))

#调整绘图格式

axis_theme<-theme(

  axis.title.x=element_text(colour="#36648B"),#x轴标题设置,优先级高于axis.title

  axis.title.y=element_text(colour="#36648B"),#同上

  axis.text=element_text(colour="#36648B"),#设置坐标轴刻度数字

  axis.ticks=element_line(#坐标轴刻度线的设置

  colour="#36648B",

  size=1.5,

  linetype=1,

  lineend=1),

  axis.ticks.length=unit(.4,"lines"),#设置刻度线的高度

  axis.line=element_line(#设置轴线

    colour="#36648B"))

p2 <- p1+axis_theme

p3 <- p2 + theme(plot.title = element_text(colour = "black", face = "bold", size = 20, vjust = 1))    

p4 <- p3+theme(panel.grid.minor = element_blank(),panel.background = element_blank(), panel.grid.major.y = element_line(colour='gray',linetype=3))

p4