前言
这一期 R
可视化介绍的是 leaflet 包及其扩展内容,除了《Geospatial Health Data》[1]一书中介绍的关于此包的基本使用方法外,小编还在网上探索了 leaflet 包的其他内容,详细见 CSDN[2] 网站。关于 leaflet 包的更多内容,可进入leaflet官网[3]查看学习。
Leaflet 包是制作交互式地图非常流行的开源 JavaScript
库,可以很容易地在 R
中合成和控制地图。此包是标准的 R
语言包,故可直接通过 install.packages()
翻墙安装。
我们可以调用 leaflet()
函数来创建地图,并可以使用 addTiles()
(添加背景地图)、 addPolygons()
(添加多边形)、 addLegend()
(添加图例) 等来添加图层。
在使用 leaflet
包前,要求先将地图数据转化为 EPSG4326 下的投影,使用的是 sf 包中的 st_transform()
函数。
下面给出一个用 leaflet 包创建的 1974 年北卡罗来纳州婴儿猝死数量的地图的例子。
例子:
library(sf)
map <- st_read(nameshp, quiet = TRUE) ##读取数据
map <- st_as_sf(map)
st_crs(map) ## 查看map数据的投影坐标系
## Coordinate Reference System:
## EPSG: 4267
map <- st_transform(map, 4326) ##转化为 EPSG 4326
library(leaflet)
pal <- colorNumeric("YlOrRd", domain = map$SID74)
leaflet(map) %>%
addTiles() %>%
addPolygons(
color = "black", fillColor = ~ pal(SID74), ##指定多边形边界和填充的颜色
fillOpacity = 1 ##设置不透明度
) %>%
addLegend(pal = pal, values = ~SID74, opacity = 1) ##添加图例
1974 年北卡罗来纳州婴儿猝死数量
使用 addMarkers()
函数添加标记点,其中 ~long
和 ~lat
分别代表经纬度,popup
和 label
表示标记点数字显示方式为弹窗和标签。
例子:
data(quakes) ## R 包自带数据
leaflet(data = quakes[1:20,]) %>% ##只标记前20个数据
addTiles() %>% ##添加背景地图
addMarkers(~long, ~lat, popup = ~as.character(mag), label = ~as.character(mag)) ##添加标记点
leaflet 包显示多个标记点
先设置图标后生成地图,其中叶子图像来自官网可直接在代码中引用(http://leafletjs.com/examples/custom-icons/leaf-green.png
等)。下面代码使用icons()
设置标记点形状并记为 leafIcons
, 之后在绘制地图中的addMarkers()
中加入icon = leafIcons
。
例子:
#设置图标
leafIcons <- icons(
iconUrl = ifelse(quakes$mag < 4.2,
"http://leafletjs.com/examples/custom-icons/leaf-green.png",
ifelse(quakes$mag < 5.2,"http://leafletjs.com/examples/custom-icons/leaf-red.png",
"http://leafletjs.com/examples/custom-icons/leaf-orange.png")
),
iconWidth = 38, iconHeight = 88, ##设置大小
iconAnchorX = 20, iconAnchorY = 88,
shadowUrl = "http://leafletjs.com/examples/custom-icons/leaf-shadow.png",
shadowWidth = 50, shadowHeight = 64,
shadowAnchorX = 4, shadowAnchorY = 60
)
#生成地图
leaflet(data = quakes[1:20,]) %>%
addTiles() %>% ##添加背景地图
addMarkers(~long, ~lat, icon = leafIcons)
设置图标后
NASA
星空图在生成地图的时候,可以添加多个地图底图,下面代码我们加入了三种地图以及圈点和轮廓的效果。得到的图形在右上角会出现一个选框,你可以根据自己的个人需求选择不同的展示结果。
library(leafletCN) ##leafletCN是一个基于leaflet的中国扩展包, 里面保存了一些适用于中国的区域划分数据以及一些有帮助的函数,例如高德地图
#数据生成
geo = data.frame(long = rep(121.44, 1000),
lat = rep(31.22, 1000),
mag=rep(5,1000)) #mag函数是用来衡量后面点集范围大小
geo$long = geo$long+rnorm(1000,0,1)
geo$lat = geo$lat+rnorm(1000,0,1)
geo$mag = geo$mag+rnorm(1000,0,1)
outline <- geo[chull(geo$long, geo$lat),]
map <- leaflet(geo) %>%
# 底层阶段
amap(group = "高德") %>% # 第一层底图,高德地图
addProviderTiles(providers$NASAGIBS.ViirsEarthAtNight2012, group = "黑底") %>% # 第二层底图,黑底图NASA
addProviderTiles(providers$Stamen.TonerLite, group = "白底") %>% # 第三层底图,白底图
# 点集+区域轮廓阶段
addCircles(~long, ~lat, ~7^mag/50, stroke = F, group = "圈点",color="#FFD700") %>% # 描点画圈
# 绘制轮廓,利用前面的凸集点
addPolygons(data = outline, lng = ~long, lat = ~lat,
fill = F, weight = 2, color = "#B22222", group = "轮廓") %>%
# 复选框
addLayersControl(
baseGroups = c("高德", "黑底", "白底"),
#显示层
overlayGroups = c("圈点", "轮廓"),
options = layersControlOptions(collapsed = FALSE)
)
map
下面分给出底图为高德地图和黑底图的可视化结果:
显示底图为高德地图
显示底图为黑底图
对于 leaflet 包生成的图像,如果要保存为 html
文件,可使用 htmlwidgets[4] 包中的 saveWidget()
函数;若要获取静态图像,要先将其保存为 html
文件,再使用 webshot[5] 包中的 webshot()
函数捕获静态图像。
R
对空间地理数据进行可视化。下一期将会继续介绍 mapview
包的使用,敬请期待。[1]
《Geospatial Health Data》: https://www.paulamoraga.com/book-geospatial/sec-spatialdataandCRS.html
[2]
CSDN: https://blog.csdn.net/sinat_26917383/article/details/57083985?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162980815516780274121061%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162980815516780274121061&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-5-57083985.first_rank_v2_pc_rank_v29&utm_term=leaflet&spm=1018.2226.3001.4187
[3]
leaflet官网: https://leafletjs.com
[4]
htmlwidgets: https://github.com/ramnathv/htmlwidgets
[5]
webshot: https://github.com/wch/webshot
推荐: 可以保存以下照片,在 b 站扫该二维码,或者 b 站搜索【庄闪闪
】观看 Rmarkdown 系列的视频教程。Rmarkdown 视频新增两节视频(写轮眼幻灯片制作)需要视频内的文档,可在公众号回复【rmarkdown
】