leaflet在線地圖——常用熱力地圖

這一篇是leaflet動態地圖的第四篇,也是最值得推薦的一篇,這一篇涉及到熱力地圖填充,通過該篇內容,大家可以體會大leaflet在線地圖的R借口在處理熱力地圖上面顏色標度映射的強大優勢。

載入包:

library(plyr)library(maps)library(mapdata)library(leaflet)library(stringi)library(maptools)library(htmltools)library(RColorBrewer)library(ggplot2)library(rgdal)

地圖素材載入:(leaflet支持多種地圖素材,比如常見的shapefile格式、json格式以及其他在線地圖,但是因為json格式本來還沒有很熟練,這裡用shp格式地圖素材為例進行加講解)。

肯定會有小夥伴兒會問,既然leaflet本身就是在線地圖,為啥還要費事兒載入shp地圖素材就進行映射,因為leaflet在線地圖提供的地圖底圖本身具有多級縮放特性,每一縮放級別都有對應的行政區劃界線,但是這些參數和行政區劃是封裝在底層的js語言中的,我們無法使用R語言直接進行調用,只能作為一個圖層素材進行背景修飾,說白了,其實我們想要的僅僅是多級縮放的動態切換效果,這樣再結合我們自定義的地圖素材,可以呈現出更加完美的效果。(只有熱力填充地圖需要定義區域界線,而點圖和線圖都可以直接利用leaflet本身的地圖素材,因為只需要坐標點位置即可)。

我們常用的地圖素材資源無非以下三種,R包內置的地圖數據、shapefile格式和json格式。以下是三種格式素材導入並在leaflet中製作的地圖的基本代碼:

maps包:

mapStates<-map("state",fill=TRUE,plot=FALSE)leaflet(mapStates) %>% addTiles() %>%addPolygons(fillColor=topo.colors(10,alpha =NULL), stroke = FALSE)

mapWorld<-map("world",fill=TRUE,col=rainbow(200),ylim=c(-60,90),mar=c(0,0,0,0))leaflet(mapWorld) %>% addTiles() %>%addPolygons(fillColor = topo.colors(10, alpha = NULL), stroke = FALSE)

shapefile:

American_map <-readShapePoly("C:/rstudy/USA_map/STATES.SHP")American_map$STATE_NAME = iconv(American_map$STATE_NAME,"UTF8","CP936") leaflet(American_map)%>%addTiles()%>%addPolygons(popup=~STATE_NAME,fillColor=topo.colors(10,alpha=NULL),stroke=FALSE)

json文件:

library(jsonlite)geoData<-readLines("D:/R/mapdata/State/USA.json",warn=FALSE)%>%paste(collapse="
")%>%fromJSON(simplifyVector=FALSE)geoData$stylex=list(weight=1,color="red",fillColor="green",opacity=1,fill=TRUE,fillOpacity=0.6)leaflet()%>%setView(lng=-98.961387,lat=39.708533,zoom=3)%>%addTiles()%>%addGeoJSON(geoData)

前兩種素材作圖過程大同小異,特別是一些標度的屬性聲明很類似ggplot中的函數過程,但是json格式的素材操作起來就不是很友好,他的標度屬性是要在數據文件中新建style的list對象進行生命,而且json格式中的list非常多,結構相對複雜,至今我也沒完全搞明白如果自由操作。

下面是承接上面shapefile格式素材做展現的四中顏色標度(三種連續性標度和一種分類標度的映射過程)。

#colorQuantile(連續性數值變數的百分比顏色過度):

pal <- colorQuantile("Greens",American_map@data$POP1990)leaflet(American_map)%>%addTiles()%>%addPolygons(color=~pal(American_map@data$POP1990),fillOpacity = 0.8,weight=1)%>%addLegend(pal=pal,values=American_map@data$POP1990,position="bottomleft",title = "1990年人口數量(萬人)")

以下兩種同屬連續性數值變數(使用顏色數量不同)

colorNumeric(多色過度):pal<-colorNumeric(c("darkgreen","yellow","orangered"),American_map@data$POP1990)leaflet(American_map)%>%addTiles() %>%addPolygons(color=~pal(American_map@data$POP1990),fillOpacity = 0.8,weight=1)%>%addLegend(pal=pal,values=American_map@data$POP1990,position="bottomleft",title = "1990年人口數量(萬人")

colorNumeric(單色過度):pal<-colorNumeric("Greens",American_map@data$POP1990)leaflet(American_map)%>%addTiles()%>%addPolygons(color=~pal(American_map@data$POP1990),fillOpacity = 0.8,weight=1)%>%addLegend(pal=pal,values=American_map@data$POP1990,position="bottomleft",title="1990年人口數量(萬人)")

colorBin(多色色漸變分組過度):

pal<-colorBin(c("darkgreen","yellow","orangered"),American_map@data$POP1990,8)leaflet(American_map) %>% addTiles() %>%addPolygons(color=~pal(American_map@data$POP1990),fillOpacity=0.8,weight=1)%>%addLegend(pal=pal,values=American_map@data$POP1990,position="bottomleft",title="1990年人口數量(萬人)")

離散標度:(這個例子是用在變數本身就是因子變數的情況下,算是分類變數情況下的顏色標度映射)

china_map<-readShapePoly("c:/rstudy/bou2_4p.shp")mydata<-read.csv("c:/rstudy/geshengzhibiao.csv")mydata$type<-factor(sample(LETTERS[1:5],33,replace=TRUE))shape <- merge(china_map,mydata,by="NAME")pal <- colorFactor(c("green","red","blue","yellow","brown"), domain = c("A", "B","C","D","E"))#設置色盤:i_popup<-paste0("<strong>Province:</strong>",shape$NAME,"<br>","<strong>Level:</strong>",shape$type)

#設置彈出窗口

leaflet(shape)%>%addTiles()%>% setView(116.387021,39.969369,zoom=3)%>%addPolygons(fillColor=~pal(shape$type),fillOpacity=0.8,color="#000000",weight=1,popup=i_popup)%>%addLegend(pal=pal,values=shape@data$type,position="bottomright",title=paste0("小魔方基團2016年","<br>","營業分布等級"))

聯繫方式:

wechat:ljty1991

Mail:578708965@qq.com

個人公眾號:數據小魔方(datamofang)

團隊公眾號:EasyCharts

qq交流群:[魔方學院]553270834


推薦閱讀:

pyecharts 又更新啦!繪圖速度更快啦!
技術乾貨:日誌數據可視化分析展示平台的建設之路
如何製作非常精美的圖表?
Excel史上最全的氣泡與方塊系列的圖表
學會這些圖表,老闆看了想打錢。

TAG:R编程语言 | 数据可视化 | 地图 |