网络搜索“时间序列图”一词,出现的多为折线图(图1),这也是时序图中使用最多的一种类型,那下面我们就从折线类型的时序图开始吧。 
图1 “时间序列图”的搜索结果 今天的分享主要使用到ggplot2、scales和reshape2三个R包:画图首选当然还是强大的ggplot2包;scales包提供美化坐标轴、图例等的一些函数;reshape2包用于数据的格式转换,作图时通常需要将“宽格式”的数据转换为“长格式”的数据格式。 library(ggplot2) library(scales) library(reshape2)
本例所用的数据为2020年3月1日至4月14日四个国家的新冠肺炎的疫情数据,表1展示了前10天的数据,此为“宽格式”的数据格式。为作图做准备,需使用as.Date函数将date变量转换为时间类型。 表1 案例数据库(部分) 
data1<-read.csv('dailynew.csv',header=TRUE) #读取数据 Sys.setlocale('LC_TIME', 'English') #根据需要可选择更改时间显示为英文 data1$date <-as.Date(data1$date) #将date变量转换为时间类型
3.1单个类别 ggplot2绘图的基本思路依次指定数据集data、数据映射aes、图类型geom_。首先,我们展示一个国家发病情况的时序图。通过ggplot()函数指定数据库为data1,将date和Brazil分别映射到x和y轴, geom_line指定折线图(color和size分别指定折线的颜色和粗细),那么,基本的时序图雏形就出来了(图2)。ggplot(data=data1,aes(x=date,y=Brazil))+ geom_line(color='lightskyblue',size=1.3)
 除了折线图,柱形和散点的时间序列图也应用较多,只需要更换相应的几何图层函数即可(图3和图4)。#柱形 ggplot(data=data1,aes(x=date,y=Brazil))+ geom_bar(stat = 'identity',fill='lightskyblue') #散点 ggplot(data=data1,aes(x=date,y=Brazil))+ geom_point(color='lightskyblue',size=3)

图3 柱形时间序列图 
那么,如果想同时展示多个多家的发病情况,我们需通过melt函数将数据格式先做“宽转长”,转换后数据变为三列:时间变量、类别变量和对应值。data1.1<-melt(data1,id='date') names(data1.1)<-c('date','country','newcases') #重命名
作图思路类似地,通过ggplot()函数指定数据库,指定映射到x和y轴的变量, 此处应注意的是,由于有多个国家,在aes中需用特定参数指定做颜色分类的变量country(折线图和点图用color,柱状图用fill)。facet_grid是将不同的国家分到不同的绘图面板中展示,country~. 表示纵向排列多个绘图面板, .~country则表示横向排列。theme主题函数中legend.position 参数指定 'none'表示隐藏图列。 ggplot(data1.1,aes(x=date,y=newcases,color=country))+ geom_line(size=1.3)+ facet_grid(country~.,scales = 'free')+ #纵向 theme(legend.position = 'none')
ggplot(data1.1,aes(x=date,y=newcases,fill=country))+ geom_bar(stat = 'identity',size=0.3)+ facet_grid(.~country,scales = 'free')+ #横向 theme(legend.position = 'none')
图6 多分类柱形时间序列图 前面,我们按照基本绘图思路(数据集-->数据映射-->图类型)和分面设置,得到时序图的”雏形”,然而,很多细节还需要完善。其中,对时间序列图非常重要的时间坐标标签的设置,本例按照数据的时间设置起止时间和时间间隔3天,赋值给变量datebreak,然后在scale_x_date使用即可;根据数据的时间长短,还可以按周week、月month、年year。其他常规有标题、字体、颜色等的设置,都是使用ggplot2美化常用的函数。 datebreak<-seq(as.Date('2020-03-01'),as.Date('2020-04-15'),by='3 days') ggplot(data1.1,aes(x=date,y=newcases,fill=country))+ geom_bar(stat = 'identity',size=0.3)+ #柱形图 facet_grid(country~.,scales = 'free')+ #分面 ylab('Cases')+ #纵坐标标题 xlab('Date')+ #横坐标标题 ggtitle('四个国家新增病例情况')+ #图的标题 scale_x_date(breaks = datebreak,labels=date_format('%d-%b'))+ ## theme主题美化 theme(axis.title = element_text(size=18), #坐标标题的设置 plot.title = element_text(size=20,hjust=0.5), #图标题的设置 axis.text.x = element_text(angle=25,hjust=0.8,size=15), #x坐标标签设置 axis.text.y = element_text(size=15), # y坐标标签设置 strip.text= element_text(size=rel(1.2)), # 分面标签设置 panel.background = element_rect(colour = 'gray99'), #画板背景设置 legend.position = 'none')+ #图例位置设置:不显示 scale_fill_brewer(palette ='Set2') # 颜色设置

图7 调整后的多分类柱形时间序列图 根据数据内容和所想展示的信息,我们可以通过在ggplot2包里找到相应的函数实现。简单美化后的时序图如图7。看完上面的内容,是不是好奇自己手头的数据能做出什么样的时序图呢?那就赶快去试一下吧。 制作:胡建雄、吴君乐
初审:胡建雄 审核:肖建鹏、刘涛
|