前言說明
對於地域信息的描述,採用地圖的形式展現會比語言描述或者一般的條形圖、餅圖更直觀,近期需要展現不同地區數據差別,可以借鑑一些網站例如地圖惠等導入數據製作,但很多都有一定限制,例如註冊收費等,故利用R進行了繪製。參考openthings的博客成功製作出了漂亮的地圖,他的博客寫的很詳細,很贊。
首先下載地圖文件及其他用到的數據,解壓保存到自己指定的文件夾中,繪圖所用到的數據均在該文件中。
R代碼實現
##加載相關包
library(mapdata)
library(maptools)
library(ggplot2)
library(plyr)
讀取地圖文件,並繪製出圖形
china_map=readShapePoly("E://study_data//chinaprovinceborderdata_tar_gz//bou2_4p.shp")
plot(china_map)
效果如圖,由於投影結果過於扁平,故需要調整。
ggplot(china_map,aes(x=long,y=lat,group=group))+
geom_polygon(fill="white",colour="black")+
coord_map("polyconic")+
theme(
panel.grid=element_blank(),
panel.background=element_blank(),
axis.text=element_blank(),
axis.ticks=element_blank(),
axis.title=element_blank(),
legend.position=c(0.2,0.3)
)
調整投影方式後,圖像如下,可以不要theme部分,自己查看效果,會有經緯線等信息。
x<-china_map@data
xs<-data.frame(x,id=seq(0:924)-1)#地圖中共計有925個地域信息
china_map1<-fortify(china_map)
china_map_data<-join(china_map1,xs,type="full")#基於id進行連接
#unique(china_map@data$NAME)#查看地圖數據中保存的地域名稱,編輯自己的數據與其一致
mydata<-read.csv("E://study_data//data_dt.csv",header=T,as.is=T)
china_data <- join(china_map_data, mydata, type="full")#基於NAME字段進行連接,NAME字段來自於地圖文件中
上述代碼將地圖數據與自己的數據進行連接,合併在一起,進一步繪製符合自己要求的熱力圖。
ggplot(china_data,aes(x=long,y=lat,group=group,fill=ratio))+
geom_polygon(colour="grey40")+
scale_fill_gradient(low="white",high="red")+
coord_map("polyconic")+
theme(
panel.grid=element_blank(),
panel.background=element_blank(),
axis.text=element_blank(),
axis.ticks=element_blank(),
axis.title=element_blank(),
legend.position=c(0.2,0.3)
)##參數“ratio”爲我們要展現的數據指標,基於該指標繪製熱力圖
圖形結果如下,是不是有那麼一丟丟好看,顏色可自己調整,這裏我選用的紅色。
下面加上地區標籤。
province_city<-read.csv("E://study_data//pcity.csv",header=T,as.is=T)#獲取省會城市座標
ggplot(china_data,aes(long,lat))+
geom_polygon(aes(group=group,fill=ratio),colour="grey",size=0.01)+
scale_fill_gradient(low="white",high="red")+
coord_map("polyconic")+
geom_text(aes(x=jd,y=wd,label=name),data=province_city,colour="black",size=2.5)+
theme(
panel.grid=element_blank(),
panel.background=element_blank(),
axis.text=element_blank(),
axis.ticks=element_blank(),
axis.title=element_blank()
)
邊緣色爲黑色個人覺得不好看很醜,調整爲grey,最終成果圖如下。