網(wǎng)絡搜索“時間序列圖”一詞,出現(xiàn)的多為折線圖(圖1),這也是時序圖中使用最多的一種類型,那下面我們就從折線類型的時序圖開始吧。 
圖1 “時間序列圖”的搜索結果 今天的分享主要使用到ggplot2、scales和reshape2三個R包:畫圖首選當然還是強大的ggplot2包;scales包提供美化坐標軸、圖例等的一些函數(shù);reshape2包用于數(shù)據(jù)的格式轉(zhuǎn)換,作圖時通常需要將“寬格式”的數(shù)據(jù)轉(zhuǎn)換為“長格式”的數(shù)據(jù)格式。 library(ggplot2) library(scales) library(reshape2)
本例所用的數(shù)據(jù)為2020年3月1日至4月14日四個國家的新冠肺炎的疫情數(shù)據(jù),表1展示了前10天的數(shù)據(jù),此為“寬格式”的數(shù)據(jù)格式。為作圖做準備,需使用as.Date函數(shù)將date變量轉(zhuǎn)換為時間類型。 表1 案例數(shù)據(jù)庫(部分) 
data1<-read.csv('dailynew.csv',header=TRUE) #讀取數(shù)據(jù) Sys.setlocale('LC_TIME', 'English') #根據(jù)需要可選擇更改時間顯示為英文 data1$date <-as.Date(data1$date) #將date變量轉(zhuǎn)換為時間類型
3.1單個類別 ggplot2繪圖的基本思路依次指定數(shù)據(jù)集data、數(shù)據(jù)映射aes、圖類型geom_。首先,我們展示一個國家發(fā)病情況的時序圖。通過ggplot()函數(shù)指定數(shù)據(jù)庫為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)
 除了折線圖,柱形和散點的時間序列圖也應用較多,只需要更換相應的幾何圖層函數(shù)即可(圖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 柱形時間序列圖 
那么,如果想同時展示多個多家的發(fā)病情況,我們需通過melt函數(shù)將數(shù)據(jù)格式先做“寬轉(zhuǎn)長”,轉(zhuǎn)換后數(shù)據(jù)變?yōu)槿校簳r間變量、類別變量和對應值。data1.1<-melt(data1,id='date') names(data1.1)<-c('date','country','newcases') #重命名
表2 轉(zhuǎn)換后的數(shù)據(jù)庫作圖思路類似地,通過ggplot()函數(shù)指定數(shù)據(jù)庫,指定映射到x和y軸的變量, 此處應注意的是,由于有多個國家,在aes中需用特定參數(shù)指定做顏色分類的變量country(折線圖和點圖用color,柱狀圖用fill)。facet_grid是將不同的國家分到不同的繪圖面板中展示,country~. 表示縱向排列多個繪圖面板, .~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ù)據(jù)集-->數(shù)據(jù)映射-->圖類型)和分面設置,得到時序圖的”雛形”,然而,很多細節(jié)還需要完善。其中,對時間序列圖非常重要的時間坐標標簽的設置,本例按照數(shù)據(jù)的時間設置起止時間和時間間隔3天,賦值給變量datebreak,然后在scale_x_date使用即可;根據(jù)數(shù)據(jù)的時間長短,還可以按周week、月month、年year。其他常規(guī)有標題、字體、顏色等的設置,都是使用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')+ #縱坐標標題 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 調(diào)整后的多分類柱形時間序列圖 根據(jù)數(shù)據(jù)內(nèi)容和所想展示的信息,我們可以通過在ggplot2包里找到相應的函數(shù)實現(xiàn)。簡單美化后的時序圖如圖7??赐晟厦娴膬?nèi)容,是不是好奇自己手頭的數(shù)據(jù)能做出什么樣的時序圖呢?那就趕快去試一下吧。 制作:胡建雄、吳君樂
初審:胡建雄 審核:肖建鵬、劉濤
|