上一回咱們說到,R語言不僅有極其強大的統計計算功能,而且在信息可視化處理、繪圖上是一把好手1,那我們今天就具體談談如何用R語言繪製地圖。
今天大廚主要做以下三件事:調取基礎地圖數據並繪製、讀取網頁數據製圖、繪製遷徙圖。
俗話說:「磨刀不誤砍柴工」,為了更好的操作體驗,你需要安裝如下拓展包。
#install.packages("maps")
library(maps)
#install.packages("mapdata")
library(mapdata)
#install.packages("maptools")
library(maptools)
#install.packages("devtools")
library(devtools)
#library(devtools)
install_github('badbye/baidumap')
#library(devtools)
install_github('lchiffon/REmap')
#library(REmap)
上述R軟體拓展包中存儲著常見地圖的數據,如maps包中存有世界地圖、美國地圖、美國各州地圖等,加載了這個包,就可以用幾行簡單的代碼繪製出上述地圖。
其中mapdata包比較久遠,雖有中國地圖的數據,但是比較舊,未得到及時更新。
從上述拓展包裡獲取基礎地圖數據,我們可能面臨再用顏色填充或者其他操作繪製的需要。
library(maps)library(maps)
map("world", fill = TRUE, col = rainbow(209),
mar= c(0, 0, 2, 0)
title("美國地圖")
library(maps)
map('state',region = c('new york', 'new jersey', 'penn'),
fill= TRUE, col = rainbow(3), mar = c(2, 3, 4, 3))
title("美國三州地圖")
library(mapdata)
map("china",col = "red4", ylim = c(18, 54), panel.first = grid())
title("中國地圖")
library(maptools)
china<-readShapePoly('bou2_4p.shp')
plot(china)
補充:##mapdata裡的中國數據比較陳舊,比如其上重慶還未從四川分出來
我們以基礎地圖中的中國地圖為例,我們想要:
1.給四個直轄市進行著色
getColor=function(mapdata,provname,provcol,othercol)補充:##mapdata是存放地圖數據的變量
##provname是需要改變顏色的地區的名稱
##provcol是對應於provname的代表顏色的向量,名稱和數字均可
2.通過顏色深淺顯示人口多
provname=c("北京市","天津市","河北省","山西省","內蒙古自治區","遼寧省","吉林省","黑龍江省","上海市","江蘇省","浙江省","安徽省","福建省","江西省","山東省","河南省","湖北省","湖南省","廣東省","廣西壯族自治區","海南省","重慶市","四川省","貴州省","雲南省","西藏自治區","陝西省","甘肅省","青海省","寧夏回族自治區","新疆維吾爾自治區","臺灣省","香港特別行政區")
pop=c(1633,1115,6943,3393,2405,4298,2730,3824,1858,7625,
5060,6118,3581,4368,9367,9360,5699,6355,9449,
4768,845,2816,8127,3762,4514,284,3748,2617,
552,610,2095,2296,693)
provcol=rgb(red=1-pop/max(pop)/2,green=1-pop/max(pop)/2,blue=0)plot(china,col=getColor(china,provname,provcol,"white"),xlab="",ylab="")
獲取數據
數據來源:鳳凰新聞H5作品 《你居住的城市有多少家莆田系醫院?》
raw= readLines("http://news.ifeng.com/mainland/special/ptxyy/",encoding= "UTF-8")
rawHospital= raw[123 : 238]
extFun= function(x){
split= strsplit(x, "','")
out= strsplit(split[[1]][2], "<br/>")
return(out)
}
extFun(rawHospital[1])
hosList= sapply(rawHospital,extFun)
hospital= c()
for(iin 1:length(hosList)) hospital = append(hospital, hosList[[i]])
library(baidumap)
blackHospital= getCoordinate(hospital, formatted = T)
blackHospital= na.omit(blackHospital)
plotdata= data.frame(lon = blackHospital[,1],
lat= blackHospital[,2],
city= rownames(blackHospital))
第一步:獲取一個城市向量的經緯度
library(REmap)
city_vec = c('上海','廣州','大連','武漢','廈門','拉薩','長春','包頭','重慶','常州')
get_city_coord("上海")
get_geo_position (city_vec)
第二步:繪製連線圖
set.seed(125)
origin= rep("北京",10)
destination= city_vec
dat= data.frame(origin,destination)
out= remap(dat,title = "REmap實例數據",subtitle = "theme:Dark")
plot(out)
補充:##theme為主題,可選Dark、Sky、blue和none四種;
在Windows上操作時,需要將上述命令中的漢字轉換為拼音才可識別操作,比如「上海」需要輸入為"shanghai"
素材 | 顧志娟/陳燕霞/姚倩
參考:1.R語言繪製中國地圖,發於「加百力」公號,2015/05/05
點擊「閱讀原文」進入下載連結
密碼: fe19