大家大概都對如下信息圖並不陌生,該圖用100%堆積面積圖的方式來表現不同時期不同國家人數所占的比例。這是一種很有意思的表達方式,而面積圖也是很常用的數據圖表,現在讓我們一起來看看如何在R里用ggplot2和plot.area來制作一個面積圖。

在制作圖表之前,首先我們先創建一些隨機示例數據。R代碼如下:
-
1 # 創建隨機數 2 set.seed(3)
3 # 創建時間序列(0-20的time step) 4 t.step<-seq(0,20)
5 # 創建十組變量名(從a到j) 6 grps<-letters[1:10]
7 # 創建一個由隨機數組成的十組變量的時間序列 8 grp.dat<-runif(length(t.step)*length(grps),5,15)
9 # 為繪圖而創建所需的dataframe 10 grp.dat<-matrix(grp.dat,nrow=length(t.step),ncol=length(grps)) 11 grp.dat<-data.frame(grp.dat,row.names=t.step)
數據結果如圖所示:

接下來,我們用plot.area來繪制一個簡易的面積圖,代碼如下:
-
1 source("https://gist.github.com/fawda123/6589541/raw/8de8b1f26c7904ad5b32d56ce0902e1d93b89420/plot_area.r") 2 plot.area(grp.dat)
效果如下:

而對於plot.area,有很多參數可以進行調整來得到不同效果的圖,比如顏色,坐標名稱,是否100%堆積等。具體參數設置可參考如下:
若我們調整顏色:
-
1 plot.area(grp.dat,col=c('red','lightgreen','purple'))
得到的效果如下:

接下來我們看看如何用ggplot2來繪制一個面積圖。在繪圖之前,首先我們需要轉換我們的數據格式,需要將多個列匯總到一個變量列(variable)和一個數值列(value), 轉置數據的代碼如下:
-
1 p.dat<-data.frame(step=row.names(grp.dat),grp.dat,stringsAsFactors=F) 2 p.dat<-melt(p.dat,id='step') 3 p.dat$step<-as.numeric(p.dat$step)
接下來,我們需要導入ggplot2,以及繪制面積圖,代碼如下:
-
1 # 導入包 2 require(ggplot2) 3 require(reshape) 4 require(gridExtra) 6 # 繪制面積圖 7 p<-ggplot(p.dat,aes(x=step,y=value)) 8 p1<-p + geom_area(aes(fill=variable))+ theme(legend.position="bottom") 9 p2<-p + geom_area(aes(fill=variable),position='fill')
我們來看一下p1和p2分別的效果:


當然,geom有更多好玩的應用,具體可以戳:http://docs.ggplot2.org/current/geom_area.html