網(wǎng)絡(luò)搜索“時(shí)間序列圖”一詞,出現(xiàn)的多為折線圖(圖1),這也是時(shí)序圖中使用最多的一種類型,那下面我們就從折線類型的時(shí)序圖開始吧。

圖1 “時(shí)間序列圖”的搜索結(jié)果
今天的分享主要使用到ggplot2、scales和reshape2三個(gè)R包:畫圖首選當(dāng)然還是強(qiáng)大的ggplot2包;scales包提供美化坐標(biāo)軸、圖例等的一些函數(shù);reshape2包用于數(shù)據(jù)的格式轉(zhuǎn)換,作圖時(shí)通常需要將“寬格式”的數(shù)據(jù)轉(zhuǎn)換為“長格式”的數(shù)據(jù)格式。
library(ggplot2)
library(scales)
library(reshape2)
本例所用的數(shù)據(jù)為2020年3月1日至4月14日四個(gè)國家的新冠肺炎的疫情數(shù)據(jù),表1展示了前10天的數(shù)據(jù),此為“寬格式”的數(shù)據(jù)格式。為作圖做準(zhǔn)備,需使用as.Date函數(shù)將date變量轉(zhuǎn)換為時(shí)間類型。
表1 案例數(shù)據(jù)庫(部分)

data1<-read.csv('dailynew.csv',header=TRUE) #讀取數(shù)據(jù)
Sys.setlocale('LC_TIME', 'English') #根據(jù)需要可選擇更改時(shí)間顯示為英文
data1$date <-as.Date(data1$date) #將date變量轉(zhuǎn)換為時(shí)間類型
3.1單個(gè)類別
ggplot2繪圖的基本思路依次指定數(shù)據(jù)集data、數(shù)據(jù)映射aes、圖類型geom_。首先,我們展示一個(gè)國家發(fā)病情況的時(shí)序圖。通過ggplot()函數(shù)指定數(shù)據(jù)庫為data1,將date和Brazil分別映射到x和y軸, geom_line指定折線圖(color和size分別指定折線的顏色和粗細(xì)),那么,基本的時(shí)序圖雛形就出來了(圖2)。ggplot(data=data1,aes(x=date,y=Brazil))+
geom_line(color='lightskyblue',size=1.3)

除了折線圖,柱形和散點(diǎn)的時(shí)間序列圖也應(yīng)用較多,只需要更換相應(yīng)的幾何圖層函數(shù)即可(圖3和圖4)。#柱形
ggplot(data=data1,aes(x=date,y=Brazil))+
geom_bar(stat = 'identity',fill='lightskyblue')
#散點(diǎn)
ggplot(data=data1,aes(x=date,y=Brazil))+
geom_point(color='lightskyblue',size=3)

圖3 柱形時(shí)間序列圖

那么,如果想同時(shí)展示多個(gè)多家的發(fā)病情況,我們需通過melt函數(shù)將數(shù)據(jù)格式先做“寬轉(zhuǎn)長”,轉(zhuǎn)換后數(shù)據(jù)變?yōu)槿校簳r(shí)間變量、類別變量和對(duì)應(yīng)值。data1.1<-melt(data1,id='date')
names(data1.1)<-c('date','country','newcases') #重命名
表2 轉(zhuǎn)換后的數(shù)據(jù)庫作圖思路類似地,通過ggplot()函數(shù)指定數(shù)據(jù)庫,指定映射到x和y軸的變量, 此處應(yīng)注意的是,由于有多個(gè)國家,在aes中需用特定參數(shù)指定做顏色分類的變量country(折線圖和點(diǎn)圖用color,柱狀圖用fill)。facet_grid是將不同的國家分到不同的繪圖面板中展示,country~. 表示縱向排列多個(gè)繪圖面板, .~country則表示橫向排列。theme主題函數(shù)中l(wèi)egend.position 參數(shù)指定 '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 多分類柱形時(shí)間序列圖
前面,我們按照基本繪圖思路(數(shù)據(jù)集-->數(shù)據(jù)映射-->圖類型)和分面設(shè)置,得到時(shí)序圖的”雛形”,然而,很多細(xì)節(jié)還需要完善。其中,對(duì)時(shí)間序列圖非常重要的時(shí)間坐標(biāo)標(biāo)簽的設(shè)置,本例按照數(shù)據(jù)的時(shí)間設(shè)置起止時(shí)間和時(shí)間間隔3天,賦值給變量datebreak,然后在scale_x_date使用即可;根據(jù)數(shù)據(jù)的時(shí)間長短,還可以按周week、月month、年year。其他常規(guī)有標(biāo)題、字體、顏色等的設(shè)置,都是使用ggplot2美化常用的函數(shù)。
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')+ #縱坐標(biāo)標(biāo)題
xlab('Date')+ #橫坐標(biāo)標(biāo)題
ggtitle('四個(gè)國家新增病例情況')+ #圖的標(biāo)題
scale_x_date(breaks = datebreak,labels=date_format('%d-%b'))+
## theme主題美化
theme(axis.title = element_text(size=18), #坐標(biāo)標(biāo)題的設(shè)置
plot.title = element_text(size=20,hjust=0.5), #圖標(biāo)題的設(shè)置
axis.text.x = element_text(angle=25,hjust=0.8,size=15), #x坐標(biāo)標(biāo)簽設(shè)置
axis.text.y = element_text(size=15), # y坐標(biāo)標(biāo)簽設(shè)置
strip.text= element_text(size=rel(1.2)), # 分面標(biāo)簽設(shè)置
panel.background = element_rect(colour = 'gray99'), #畫板背景設(shè)置
legend.position = 'none')+ #圖例位置設(shè)置:不顯示
scale_fill_brewer(palette ='Set2') # 顏色設(shè)置

圖7 調(diào)整后的多分類柱形時(shí)間序列圖
根據(jù)數(shù)據(jù)內(nèi)容和所想展示的信息,我們可以通過在ggplot2包里找到相應(yīng)的函數(shù)實(shí)現(xiàn)。簡(jiǎn)單美化后的時(shí)序圖如圖7??赐晟厦娴膬?nèi)容,是不是好奇自己手頭的數(shù)據(jù)能做出什么樣的時(shí)序圖呢?那就趕快去試一下吧。