这一篇是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
leaflet(mapStates) %>% addTiles() %>%addPolygons(fillColor=topo.colors(10,alpha =NULL), stroke = FALSE)
mapWorld
leaflet(mapWorld) %>% addTiles() %>%addPolygons(fillColor = topo.colors(10, alpha = NULL), stroke = FALSE)
shapefile:
American_map
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%paste(collapse="\n")%>%fromJSON(simplifyVector=FALSE)
geoData$style=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
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
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
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
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
mydata
mydata$type
shape
pal
i_popupProvince:",shape$NAME,"
",
"Level:",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年","
","营业分布等级"))
联系方式:
wechat:ljty1991
Mail:578708965@qq.com
个人公众号:数据小魔方(datamofang)
团队公众号:EasyCharts
qq交流群:[魔方学院]553270834