R語言 地圖漫談
由於R語言所帶的中國地圖過於老舊,因此我們通過尋找外部地圖資料檔案,並在R中載入並展示地圖。
我們所用的地圖資料檔案是Shapefile格式的檔案,它可以儲存地理要素的幾何位置和屬性資訊,Shapefile中的地理要素可通過點、線、面來表示。一個完整的shape檔案由一組檔案組成,其中必要的基本檔案包括座標檔案(.shp),索引檔案(.shx),屬性檔案(.dbf)三個檔案,有時候還會出現特徵空間索引檔案(.sbn和.sbx)。地圖資料檔案下載地址)(http://cos.name/wpcontent/uploads/2009/07/chinaprovinceborderdata_tar_gz.zip),下載解壓縮後,可以看到有三個檔案,分別是bou2_4p.dbf,dou2_4p.shp,bou2_4p.shx,數字1~4分別代表國家、省、市、縣的4級行政劃分,字母p結尾的表示多邊形資料,用來繪製區域,bou2表示是省級行政劃分的邊界。這份資料並不是最新的資料,最新的資料在國家基礎地理資訊中心找不到,大概要購買才能得到,不過對於一般的繪圖而言,這份資料已經可以滿足要求。
這篇文章繪製地圖用到了3個包:sp,maptools,ggplot2。Sp包主要提供了操作地理資訊資料的一些方。Maptools包提供了讀入和操作地理資訊資料的一些工具。ggplot2提供了資料視覺化的功能。具體功能請檢視各包附帶文件。
> library(sp)
>library(maptools)#windows系統載入時都會提示以下資訊,對繪製影響不大。
Checking rgeos availability:FALSE
Note: when rgeos is not available,polygon geometry computationsin maptools depend on gpclib,
which has a restricted licence. It isdisabled by default;
to enable gpclib, typegpclibPermit()
> library(ggplot2)
地圖資料基本可以分為點、線、面三種資料,在maptools包內分別有對應的函式來讀取(readShapePoints、readShapeLines和readShapePoly),這裡我們採用readShapePoly函式。
> x <-readShapePoly(file.choose()) #讀入bou2_4p.shp檔案
> class(x) #x是sp包的資料框
[1] "SpatialPolygonsDataFrame"
attr(,"package")
[1] "sp"
> names(x)
[1] "AREA" "PERIMETER" "BOU2_4M_" "BOU2_4M_ID""ADCODE93"
[6] "ADCODE99" "NAME"
我們發現x包含了7類資訊,其中AREA是地區,PERIMEIER是周長,NAME是中文名稱。其他的是一些編碼。我們採用ggplot2進行地圖繪製,ggplot2繪製的物件格式為資料框,而x的格式為地理資訊類資料框(class(x)),我們對其格式進行轉換以滿足ggplot2的繪製要求。
> china <-fortify(x)#將地理資訊檔案轉換為data.frame格式資料
Regions defined for each Polygons
> head(china)
long lat order hole piece group id
1 121.4884 53.33265 1 FALSE 1 0.1 0
2 121.4995 53.33601 2 FALSE 1 0.1 0
3 121.5184 53.33919 3 FALSE 1 0.1 0
4 121.5391 53.34172 4 FALSE 1 0.1 0
5 121.5738 53.34818 5 FALSE 1 0.1 0
6 121.5840 53.34964 6 FALSE 1 0.1 0
轉換後china資料包含7列資料,long表示精度,lat表示緯度。
現在我們就可以繪製原始的地圖了。
> p <-ggplot(china,aes(x=long,y=lat))+geom_polygon(aes(group=id),fill=I("red"))
> p1 <-p+theme(panel.background=element_rect(fill="lightblue"))+coord_map()
> p2 <-p1+theme(panel.grid=element_blank())
> p3 <-p2+theme(axis.title=element_blank())
> p4 <-p3+theme(axis.ticks=element_blank())
> p5 <-p4+theme(axis.text=element_blank())
> p6 <- p5 +theme(plot.background=element_rect(fill="lightblue"))+theme(legend.background=element_rect(fill="lightblue"))
> p6
最後,加個標題吧!
>p6+ggtitle(" 中國地圖 ")
參考資料