R語言及ggplot2在環境空氣監測數據可視化中的應用探究的論文
隨著新《環境空氣質量標準》(GB 3095-2012)的發布、實施,全國各地都在采用環境空氣自動監測以應對其嚴苛的數據有效性要求。環境空氣自動監測系統每天都在產生大量的數據,如何對數據進行有效的統計分析,成為一個新的課題。對數據的可視化,是數據分析的第一步。本文應用R語言及ggplot2圖形繪制包以浙江省常山縣城區兩個空氣自動站即環保大樓站及圖書館站2014年全年監測數據為例進行各種可視化分析,以探討該軟件在空氣質量數據分析領域應用的巨大潛力。
1 軟件準備
1.1 R語言軟件與擴展包
R語言是一種區分大小寫的解釋性語言,其具有的強大統計計算及繪圖能力,是從大數據中獲取有用信息的絕佳工具,它提供了Windows、OS X、Linux等各大操作系統下的版本,可以直接從網上免費下載、安裝、使用。R語言軟件在基本安裝中提供了大量的數據處理、統計和圖形函數,此外各社區還開發了數以千計的擴展包(packages)為R增加了更多令人驚奇的功能,本文用到的ggplot2、plyr、reshape2等即是其中的一部分。
ggplot2是目前R語言中的圖形繪制擴展包,它為R語言提供了一個基于全面而連貫的語法的繪圖系統,它由一系列獨立的圖形部件組成,并能以許多種不同的方式組合起來,使得數據分析者能用緊湊的語法輕松繪制出復雜的圖形,從而使數據分析者更能將注意力集中于數據分析本身。plyr與reshape2是兩個功能強大的數據整理擴展包,它們為R語言擴展了對數據變換、數據變形的功能。
ggplot2軟件包可以在R語言命令提示符后輸入install.packages(“ggplot2”),選擇合適的下載鏡像后,就可以自動從網上下載安裝。在Windows操作系統下下載的是二進制文件,可以直接使用;在類Unix操作系統下,下載的是包的源代碼,經過編譯后才能使用,但只要具備gcc等編譯工具,安裝都可通過簡單的命令完成。在使用前,需要輸入library(ggplot2)或require(ggplot2)調用該軟件包。plyr包等也是如此。
1.2 Excel
但面對原始數據,微軟公司的Excel往往是對數據進行清洗、分列的直觀分析利器。各地自動監測站采集并導出的原始數據往往是xml格式的,而Excel處理這種格式極為得心應手。Excel中的數據篩選功能可以輕易地刪除大量無效數據,分列功能可以將監測日期與時刻分離以便于下一步的處理,數據格式也可以得到統一,將數據“另存為”csv格式后即可通過read.csv()函數導入R軟件。R軟件也可以通過write.csv()函數寫出csv格式的文件與Excel交互使用。
2 數據處理
2.1 數據的收集與整理
在數據分析工作中,收集、整理數據的時間往往是占了工作時間的80%以上。在數據收集、整理工作中交互地使用R語言與Excel,可極大地提高工作效率。首先使用Excel將在自動監測過程中產生的無效數據進行篩選、剔除,再按需要,對某些數據進行分列處理,最后導出為csv文件后以便R語言讀取。與Matlab等將一切視為矩陣不同,R語言可以靈活地對向量、矩陣、數組、數據框、因子、列表等多種數據結構進行處理。通過read.csv()導入的數據都被視為數據框(data.frame)。數據框是R語言中最常用的數據結構,其每一列都可以包含不同模式的數據,如環境空氣監測數據之后,可以增加名為“month”的一列,用中文“一月份”表示該數據是一月份的數據,增加“site”的一列,用中文標注其站點名稱,如假設hbdl201401為導入的環保大樓站一月份數據,用R命令行示例如下:site<-rep(“環保大樓站",dim(hbdl201401))month<-rep(“一月份”,dim(hbdl201401))hbdl201401<-cbind(hbdl201401,site,month)同一站點中的數據,可以使用rbind()函數進行按月合并。當多站點數據合并時,由于設備配置的原因,數據框中各列的名稱與數量并不完全一致,使用rbind()合并數據時會出錯。如常山縣環保大樓站除常規六參數外還配有碳黑儀、能見度儀、氣象五參數等,而圖書館站中僅有常規六參數。這時的合并可以用到merge()函數。假設hbdl2014為常山縣環保大樓站2014年全年小時均值數據,而tsg2014為圖書館站數據,則可用以下命令合并數據框:
cs2014<-merge(hbdl2014,tsg2014,all=T,sort=F)合并后的數據框cs2014中在圖書館站中所沒有的碳黑儀等數據均以“NA”(缺失)表示。merge()函數可以兩兩合并大量來源不同的數據框,只需保證列名的統一,數據即可合并無誤。在R語言中用命令tail(cs2014)即可列出cs2014的`最后6行:
2.2 數據的統計變換
對數據分析的細化過程往往就是分組的過程。2.1節中為數據增加“month”一列即是為數據按月份進行分組,“site”一列即是為站點分組,“clock”一列即是為數據按時刻進行分組。在實際工作中,分析數據的角度不同,分組也是千奇百怪。如可按當日溫度差來分組,也可按平均風速的大小來分組,當然也可以按PM2.5日均值大小來分組來考察其他觀測值的情況。數據的變換與變形則是基于統計以及下一步分析的需要,將數據變化成相應的形式。
2.2.1 創建分組變量。在數據分析過程中,常常發現這種情況:組別分的太細或者需要根據原數值內容創建分組。
第一種情況可以合并組別。例如按氣象學上的規定,以每年的三、四、五月為春季,六、七、八月為夏季,九、十、十一月為秋季,十二、一、二月為冬季。需要以季節分組時,可以調用如下命令:
c s 2 0 1 4 $ s e a s o n [ c s 2 0 1 4 $ m o n t h = = ” 三月份”|cs2014$month==”四月份”|cs2014$month==”五月份”]<-”春”
c s 2 0 1 4 $ s e a s o n [ c s 2 0 1 4 $ m o n t h = = ” 六月份”|cs2014$month==”七月份”|cs2014$month==”八月份”]<-”夏”
c s 2 0 1 4 $ s e a s o n [ c s 2 0 1 4 $ m o n t h = = ” 九月份”|cs2014$month==”十月份”|cs2014$month==”十一月份”]<-”秋”
c s 2 0 1 4 $ s e a s o n [ c s 2 0 1 4 $ m o n t h = = ” 十二月份”|cs2014$month==”一月份”|cs2014$month==”二月份”]<-”冬”
運行上述命令后,數據框cs2014中就多了一個名為“season”的列,其標注了每一行數據的季節。第二種情況可以用到R語言中的cut()函數。如原數據中各污染物按月份按時刻進行濃度平均得到數據框cs2014month后,可以以0~0.040mg/m3、0.040~0.080mg/m3、>0.080mg/m3為區間將臭氧的時刻平均數據分作3個組別,分別名為“弱”、“中”、“強”,用cut()函數創建分組變量“o3level”:cs2014month$o3level<-cut(cs2014month$o3,breaks=c( 0 , 0 . 0 4 0 , 0 . 0 8 0 , I n f ) , l a b e l s = c ( “ 弱” , ”中”,”強”))
運行上述命令后,數據框cs2014month中增加了名為o3level的新列,其標注了每一行數據中臭氧的濃度水平。
2.2.2 分組變換。“plyr”包提供了一整套工
具集來處理列表(list)、數組(array)和數據框(data.frame),它可以將復雜的數據分割成幾個部分,分別對各個部分進行統計。對于數據框的操作,用的是plyr包中的ddply()函數,如:我們若想得到各個站點的各污染因子日均濃度值,則可調用如下命令:
c s d a t e m e a n < - d d p l y ( c s 2 0 1 4 , . ( d a t e , s i t e ) ,
summarise,so2=round(mean(so2,na.rm=TRUE),
3 ),n o 2 = r o u n d(me a n ( n o 2 , n a . r m = TRU E),
3),co=round(mean(co,na.rm=TRUE),2),
pm10=round(mean(pm10,na.rm=TRUE),3),
pm2.5=round(mean(pm2.5,na.rm=TRUE),3),
o3=round(mean(sort(o3,decreasing=T),
na.rm=TRUE),3))
其中cs2014指原數據框,.(date,site)括號中指的是分組變量(日期、站點),summarise命令意為從原數據中總結出一個新數據,round()為小數位數修約函數,mean()為平均函數,sort()為數據排序函數,命令中臭氧數據取其每日最大8小時平均值,其他污染物均為24小時平均值。該命令運行后就得到了一個新的數據框csdatemean。
類似的還可以用d d p l y ( ) 函數針對月份以及其他分類變量進行分組統計。如2.2.1節中提到的cs2014month,就可以調用如下命令得到:
cs2014month<-ddply(cs2014,.(clock,month),
summarise,so2=round(mean(so2,na.rm=TRUE),
3 ),n o 2 = r o u n d(me a n ( n o 2 , n a . r m = TRU E),
3),co=round(mean(co,na.rm=TRUE),2),
pm10=round(mean(pm10,na.rm=TRUE),3),
pm2.5=round(mean(pm2.5,na.rm=TRUE),3),
o3=round(mean(o3,na.rm=TRUE),3))
除此之外,plyr包還提供了一些靈活的函數如transform等用于組間數值的統計,詳見plyr包的自帶說明。
2.2.3 數據變形。reshape2包提供的melt()和dcast()函數實現的是類似于Excel中數據透視表的功能,可從繁雜的數據中摘取出想要的信息。其中melt()函數可以將多列數據篩選后融合在一起,即從“寬”變“長”,下面舉例說明:
csclockmean<-ddply(cs2014,.(clock,season),
summarise,so2=round(mean(so2,na.rm=TRUE),
3),no2=round(mean(no2,na.rm=TRUE),
3),co=round(mean(co,na.rm=TRUE),2),
pm10=round(mean(pm10,na.rm=TRUE),3),
pm2.5=round(mean(pm2.5,na.rm=TRUE),3),
o3=round(mean(o3,na.rm=TRUE),3))
csclockmelt<-melt(csclockmean,id.var=c(“clock”,”season”),measure.var=c(“so2”,”no2”,”pm2.5”))
執行以上命令后,先得到一個名為csclockmean的數據框,再通過m e l t ( ) 函數得到一個名為csclockmelt的新數據框,用head()函數分別讀取兩個數據框的前6行:
melt()函數中id.var意為標識變量,即在原數據框中需保留的列向量,measure.var意為度量變量,即在原數據框中需要融合的列向量。melt()函數生成的新數據框中保留了id.var的同時,生成了兩列:一列名為variable,包含的是measure.var;一列名為value,即原數據框中measure.var的值。由于ggplot2的獨特語法,使用melt()函數得到的新數據框可使ggplot2在同一張圖中繪制多個參數。
3 ggplot2數據可視化應用
一般認為R語言有4套圖形系統,即graphics、grid、lattice、ggplot2。其中graphics、grid、lattice被認為是基礎圖形系統,它們的繪圖命令精煉、實用、運行速度塊,制出的圖形美觀、實用,但是基礎圖形系統的制圖方式極為生硬,函數各參數繁復,令人往往在繪圖上耗費大量的時間,而不是在數據分析上。
ggplot2是2005年后才新出現的圖形系統,它提供了統一的接口及一些選項,替代了基礎圖形系統那套繁雜的修補體系,令使用者能更多地關注于數據本身。當然ggplot2中也有大量底層命令可對圖形作精細的修改。
3.1 數據的簡單分布
箱線圖是一種展示數據分布的方法, 箱內為25%~75%的值,箱中的橫線代表中位值,箱子上下豎線表示上下的相鄰值,超過相鄰值的點稱為外部點。使用ggplot2繪制常山縣兩個站點二氧化硫全年日均值分布的箱線圖命令如下所示。
ggplot(csdatemean,aes(site,so2))+geom_boxplot()+xlab(“空氣自動監測站點”)+ylab(expression(paste(“二氧化硫日均濃度”(mg/m^3))))
ggplot2有其特殊的語法,其特點是“+”號,任何圖層都可以通過“+”號來實現。geom_boxplot()是ggplot2中繪制箱線圖的函數,類似的還有geom_point()(繪制散點圖)、geom_line()(繪制折線圖)、geom_histogram()(繪制條形圖)…等。xlab()添加的是x軸上的文字說明,ylab()中的expression()函數是為了在圖中實現mg/m3的表達式。
3.2 趨勢線的添加
在數據可視化工作中,參數與參數之間往往有著或多或少的關系,添加趨勢線是探索這種關系的一種橋梁。R語言在數據分析方面最大的優勢就是其強大的數據擬合功能,它提供了線性、非線性、神經網絡、支持向量機等大量數據擬合工具。這些工具均可以與ggplot2配合使用繪制出趨勢圖形,以檢驗其擬合成果。下例使用ggplot2中的stat_smooth()函數自動添加趨勢線來探索PM2.5與PM10數據間的關系。
ggplot(csdatemean,aes(pm2.5,pm10))+geom_point(colour=”grey60”)+stat_smooth(method=lm,se=F,colour=”black”)+xlab(expression(paste(“PM2.5日均數據”(mg/m^3))))+ylab(expression(paste(“PM10日均數據”(mg/m^3))))
在geom_point()和stat_smooth()兩個函數中添加顏色參數,以使得散點圖顯得顏色淡一點,而讓趨勢線更明顯。stat_smooth()函數中method=lm指按直線方式添加趨勢線。從圖5中明顯可見PM2.5與PM10呈現了一種極強的線性關系。
3.3 分組變量的體現
在數據可視化的過程中,數據分組可以幫助人們揭示更多的細節。ggplot2可將在數據處理階段創建的分組變量以顏色、形狀、大小等形式映射于圖上。
如2.2.2節中得到了各污染物按月份的時刻濃度平均數據cs2014month,2.2.1節中用cut()函數將該數據框中臭氧濃度分為“弱”、“中”、“強”三個水平,用ggplot2繪制出二氧化氮的時刻濃度圖,并用圖中二氧化氮濃度點的大小來代表臭氧的濃度水平,命令如下:
ggplot(cs2014month,aes(clock,no2))+geom_point(aes(size=o3level))+xlab(“時刻”)+ylab(expression(paste(二氧化氮濃度(mg/m^3))))+scale_size_discrete(name=”臭氧濃度水平”)
此例geom_point()函數中的size參數將臭氧濃度水平映射到二氧化氮濃度點的大小上,如此從圖中可以明顯可見臭氧濃度水平“強”時,往往是二氧化氮濃度較低時。類似的還可以用colour、shape等將分組變量的各組別映射為顏色、形狀等,使繪制出的二維圖呈現出更多的內容。
3.4 圖形分面
數據可視化中最實用的技術之一是將分組的數據并列呈現,這樣可以使得組間數據的比較變得容易許多,ggplot2中將之稱為分面(facet)。ggplot2中可以用facet_grid()和facet_wrap()兩個函數都可以繪制出分面圖。
2.2.3中利用melt()函數得到了csclockmelt數據框,下例利用該數據,繪制四季中二氧化硫、二氧化氮、細顆粒物這三大污染物在24小時中的分布情況圖,命令如下。
csclockmelt$season<-factor(csclockmelt$season,levels=c(“春”,”夏”,”秋”,”冬”))
ggplot(csclockmelt,aes(clock,value))+geom_point(aes(shape=variable))+geom_line(aes(colour=variable))+facet_wrap(~season)+xlab
(“時刻”)+ylab(expression(paste(“濃度值”(mg/m^3))))+scale_colour_hue(name=”污染物”,labels=c(“二氧化硫”,”二氧化氮”,”細顆粒物”))+scale_shape(name=”污染物”,labels=c
(“二氧化硫”,”二氧化氮”,”細顆粒物”),solid=F)
命令中f a c t o r () 函數為季節排序, s h a p e 、colour將污染物種類映射至散點形狀、曲線顏色,facet_wrap()函數自動將分組變量season進行分面處理。如此在相同的坐標系中得到四張并列的圖,可令人更直觀地比較數據。
4 結語
R語言最初時只是一個統計分析軟件包,它擅長于繪圖、分析數據以及利用數據來擬合統計模型,在不擅長的領域如復雜數據存儲、大數據處理,它也提供了接口;ggplot2以其自成一派的語法聞名,它不需要考慮某圖形需要填充什么顏色,使用什么形狀的線段連接散點,不必去糾結基本圖形系統中那些繁雜的參數,將更多的時間用于數據分析本身。本文中某些例子由于考慮到各圖形的美觀及信息的正式性,在繪制時應用了不少ggplot2中的底層命令,顯得各例中命令較為復雜。實際應用中均可大大簡化,即使如此,與基礎圖形系統相比,ggplot2的優勢也盡顯無疑。
當然,工具永遠只能是工具,無論什么工具都無法替代有效數據的積累和大腦思考問題的角度。各地將氣象數據納入環境空氣質量數據一起分析時,思考時角度可以更加多元化;各地的一些污染控制工作內容也可以納入數據框中作分析,以評價其有效性;省、市以上的監測部門更是可以利用更多的環境空氣自動監測數據作一些地域性的探索。
【R語言及ggplot2在環境空氣監測數據可視化中的應用探究的論文】相關文章:
數據信息在醫院醫療保險管理的應用論文08-02
合作寫作在應用文教學中的策略運用論文09-18
管理會計在企業管理中的應用策略分析論文08-11
案例教學在計算機基礎課程教學中的應用論文01-02
組織行為學在企業管理中的應用策略分析論文08-11
企業SWOT分析在企業管理中的應用10-11