R语言时间序列分析变化模式可视化
1.折线图
library(openair)
df=data.frame(date=as.Date(data4_1$日期),data4_1[,c(2,4,5,9)]) #将data4_1中的日期转化为日期格式并选择绘图变量
timePlot(df,pollutant = c('AQI','PM2.5','PM10','臭氧浓度'), #绘制折线图
smooth = T, #添加平滑曲线
key = F, #不绘制关键词
date.breaks = 12,xlab='月份',ylab='') #设置x轴的间隔数
图7-3平滑线显示了4项指标的变化模式,臭氧浓度呈现出对称性,其他指标无明显固定格式,可视为随机波动。
#图7-4的绘制代码(使用图7-3构建的数据框df)
openair::summaryPlot(df,clip = F,date.breaks = 12, #不剔除离群值
type = 'density',col.hist = 'red3',xlab='',ylab='') #绘制和密度图
图7-4的折线图描述了4项指标随时间的变化特征,右侧的核密度曲线描述了4项指标的分布特征。
2. 面积图
面积图是在折线图基础上绘制的,它将折线与x轴之间的区域用颜色填充,填充的区域即为面积。
library(ggplot2)
attach(data4_1)
d=data.frame(日期=as.Date(data4_1$日期),data4_1[,c(2,4,5,9)])
df=melt(d,id.vars = '日期',variable.name = '指标',value.name = '指标值')
ggplot(df,aes(x=日期,y=指标值,fill=指标))+
geom_area()+ #绘制面积图
facet_wrap(~指标,ncol = 1)+
mytheme
library(plotrix)
d=data4_1[,c(2,4,5)]
df=d[c(1:31),] #x选择1月份的数据
stackpoly(df,
col = cm.colors(3), #设置面积填充颜色
border = 'black', #设置边线颜色
stack = T, #将不同系列的面积堆叠
staxx = F, #x轴标签不相互错开
axis4 = F, #取消第4个坐标轴
xlab='时间',ylab='指标值')
legend('topleft',legend = c('AQI','PM2.5','PM10'),ncol = 1,inset = 0.02,fill = cm.colors(3),
box.col = 'grey80',cex = 0.8) #添加图例
上图显示,AQI、PM2.5和PM10这3个指标的堆叠面积岁时间的变化十分相似,表示3个指标具有一定的相关性
library(reshape2);library('ggiraphExtra');require(ggplot2)
d=data.frame(日期=as.Date(data4_1$日期),data4_1[,c(4:9)]) #选择绘图变量,并将date合并到数据框中
dd=d[c(1:90),] #选择1-3月份的数据
df=melt(dd,id.vars = '日期',variable.name = '指标',value.name = '指标值')
ggArea(data = df,aes(x=日期,y=指标值,fill=指标),
position = 'stack', #绘制堆积面积
palette = 'Reds', #设置调色板
alpha = 0.5)+ #设置颜色透明度
theme_bw()+ #去掉底色
theme(axis.text = element_text(size = 7), #设置坐标轴字体大小
legend.position = c(0.35,0.87), #设置图例位置
legend.direction = 'horizontal', #图例水平排列
legend.text = element_text(size = '7')) #设置图例字体大小
3.蒸汽图
蒸汽图将多个时间序列叠加绘制在一幅图里。绘制蒸汽图时,函数自动将波动最大的序列放在中心基准线的最外侧,波动最小的序列放在最内侧。
library(reshape2);library(ggTimeSeries);library(ggplot2)
d=data.frame(日期=as.Date(data4_1$日期),data4_1[,-c(1,2,3)]) #选择变量
df=melt(d,id.vars = '日期',variable.name = '指标',value.name = '指标值')
ggplot(df,aes(x=日期,y=指标值,group=指标,fill=指标))+
stat_steamgraph(color='grey50',size=0.2)+
ylab('')+ #去掉y轴标签
theme(legend.text = element_text(size = '7')) #设置图例字体大小
上图显示,波动最大的是臭氧浓度和PM10,其次是PM2.5和一氧化碳,二氧化硫和二氧化氮波动最小。
4.风筝图
风筝图将每一个序列用宽度表示,也就是将一个序列的面积图以镜像的方式绘制在同一个坐标轴,多个序列的风筝图以分面的方式摆放在同一幅图里。通过观察各数据系列的风筝宽度随时间的变化发现序列的变化趋势和模式,进而分析各序列与时间维度之间的关系。
library(plotrix)
mat=data4_1[,c(4:9)];rownames(mat)=data4_1$日期;mat=as.matrix(mat) #将数据框转化为矩阵
plotrix::kiteChart(t(mat),
timex = T, #时间放在水平的x轴
normalize = T, #将每行值缩放为最大宽度为1
shownorm = F, #不显示归一化乘数
xlab = '时间',ylab = '指标',
main = '',
mar = c(3,3,1,1))
地平线图是将多个时间序列并行绘制在一幅图中,用于展示和比较多个时间序列的变化模式和特征。当可视化多个时间序列且观测值的波动幅度较大,或想要突出显示异常值而不丢失其余数据时,地平线图的优势十分明显,它可以展示多个时间序列中的异常变化和主要的变化模式。
library(latticeExtra)
d=data.frame(data4_1[,-c(1,3)]) #选择绘图数据
dt=ts(d) #生成时间序列对象
horizonplot(dt,main='地平线图',
layout = c(1,7), #1列7行的页码布局
colorkey = T, #显示色键
par.settings=list(par.main.text=list(cex=1,font=1))) #设置主标题字体大小
从上图的图块堆叠情况可以分析序列的特征和模式,以臭氧浓度为例,表示上升的蓝色图块主要出现在4-8月份这个区间,表示这段时间内臭氧浓度的值较高,而表示下降的红色图块主要出现在12月份,表示此时的臭氧浓度较低。
library(reshape2);library(ggTimeSeries);library(ggplot2)
date=as.Date(data4_1$日期) #将data4_1中的日期转化为日期变量date
d=data.frame(日期=date,data4_1[,-c(1,3)]) #选择绘图变量
dd=data.frame(日期=date,scale(d[,-1])) #构建新的数据框
df=melt(dd,id.vars = '日期',variable.name = '指标',value.name = '标准化值') #融合数据格式为长格式
mytheme=theme(axis.title = element_text(size = 8), #设置坐标轴标签的字体大小
axis.text = element_text(size = 6)) #设置坐标轴刻度字体大小
ggplot(df)+aes(x=日期,y=标准化值,fill=指标)+
stat_horizon()+ #绘制地平线图
facet_wrap(~指标,ncol = 1)+ #图形按1列分面
scale_fill_continuous(low='lightgreen',high='red')+ #设置低值和高值颜色
theme_bw()+mytheme+ #设置图形主题
theme(panel.grid = element_blank()) #去掉网格
右侧图例是连续型颜色标度,不同颜色表示不同的标准化数值大小。以臭氧浓度为例,表示上升的红色图块主要出现在4-8月份这个区间,表示这段时间内臭氧浓度的值较高。
6.双坐标图
library(plotrix)
#(a)双折线图
par(mfrow=c(2,1),lab=c(10,2,1),cex.main=0.8,font.main=1)
twoord.plot(data = data7_1,type = 'b', #设置绘图类型
lcol = 'black',rcol = 'red2',rpch = 22, #设置左侧和右侧图的颜色和点的类型
lx='年份',ly='国内生产总值',rx='年份',ry='国内生产总值指数', #设置左侧和右侧坐标轴
lytickpos = seq(10000,1000000,by=200000), #设置左侧坐标轴标签刻度
rytickpos = seq(100,120,by=2), #设置右侧坐标轴标签刻度
xlab = '年份',ylab = '国内生产总值(亿元)',rylab='国内生产总值指数(上年=100)', #设置左侧和右侧坐标轴标签
axislab.cex = 0.7, #设置坐标轴标签的字体大小
rylab.at = 110, #设置右侧坐标位置
main = '(a)双折线图',
mar = c(4,4,2,4))
#(b)条形图和折线图
twoord.plot(data = data7_1,type = c('bar','b'), #设置绘图类型
lcol = 'orange2',rcl='black',rpch = 1,
lx='年份',ly='国内生产总值',rx='年份',ry='国内生产总值指数',
lytickpos = seq(10000,1000000,by=200000),rytickpos = seq(100,120,by=2),
xlab = '年份',ylab = '国内生产总值(亿元)',rylab='国内生产总值指数(上年=100)',
axislab.cex = 0.7,rylab.at = 110, main = '(b)条形图和折线图',
mar = c(4,4,2,4))
上图显示,国内生产总值呈上升趋势,而国内生产总值指数在2007年之前呈现上升趋势,之后则呈现下降趋势。
7.日历图
如果数据是按一年中的每天记录的,则可以将每天的数据用体力的形式呈现出来,改图在空气污染物分析、风向分析中很有用。
library(readxl)
data7_2 <- read_excel("C:/Users/26601/Desktop/data7_2.xlsx")
View(data7_2)
years=c(rep('2016',365),rep('2017',365),rep('2018',365),rep('2019',365))
df=data.frame(date=as.Date(data7_2$日期),AQI=data7_2$AQI,year=years) #将data7_2中日期转化为日期变量date并添加year列
ggplot_calendar_heatmap(dtDateValue = df,
cDateColumnName = 'date', #设置日期的列名
cValueColumnName = 'AQI', #设置数据的列名
vcGroupingColumnNames = 'year', #设置分组的列名
dayBorderSize = 0.2,dayBorderColour = 'grey60', #设置每天的边界线大小和颜色
monthBorderSize = 0.5,monthBorderColour = 'white')+ #设置月份间的边界大小和颜色
scale_fill_gradientn(colors = rev(brewer.pal(11,'RdYlBu')))+ #设置调色板
facet_wrap(~year,ncol = 1) #按年份分面
右侧图例表示不同颜色深度代表的数值大小,从该图可以观察每年各月和每一天的AQI变化。
8.部分数据代码(data4_1)
data7_1部分数据截图