2.4 Making maps with R --INLA处理地理空间健康数据

地图对于传达地理空间信息非常有用。在此,我们介绍一些简单的例子,展示一些常用的软件包的使用。
在R中常用于制图的一些包,即ggplot2、leaflet、mapview和tmap。在本书的其余部分,我们将展示如何使用ggplot2和leaflet包创建更复杂的地图,以可视化几个应用程序的结果。

  • 2.4.1 ggplot2
    ggplot2(https://ggplot2.tidyverse.org/)是一个基于图形的语法来创建图形的包。这意味着我们可以使用ggplot()函数和以下元素来创建一个图。
  1. 我们想要可视化的数据。

  2. 代表数据的几何形状,如点或条。形状是用geom_*()函数来指定的。例如,geom_point()用于表示点,geom_histogram()用于表示柱状图。

  3. aes()用于将数据中的变量映射到对象的视觉属性,如颜色、大小、形状和位置。

  4. 可选的元素,如比例尺、标题、标签、图例和主题。

我们可以通过使用geom_sf()函数并提供一个简单的特征(sf)对象来创建地图。注意,如果可用的数据是SpatialPolygonsDataFrame类的空间对象,我们可以用sf包的st_as_sf()函数轻松地将其转换为sf类的简单特征对象。例如,我们可以创建一个1974年北卡罗来纳州婴儿猝死的地图(SID74),如下(图2.8)。

library(ggplot2) 
map <- st_as_sf(map) 
ggplot(map) + geom_sf(aes(fill = SID74)) + theme_bw()

在这里插入图片描述

在ggplot()中,离散变量的默认色标是scale__hue()。这里表示颜色(为点和线等特征着色)或填充(为多边形或柱状图着色)。我们可以通过使用scale_grey()来改变默认比例,scalebrewer()使用RColorBrewer包的颜色(Neuwirth, 2014),scaleviridis(discrete = TRUE)则使用viridis包的颜色(Garnier, 2018)。我们也可以用scalemanual()手动定义我们自己的颜色集。请注意,这个函数有一个逻辑参数叫drop,用来决定是否在尺度中保留不常用的因子水平。连续变量的颜色标度可以用scalegradient()来定义,它在两种颜色(低-高)之间创建一个连续的梯度,scalegradient2()创建一个发散的颜色梯度(低-中-高),scalegradientn()创建一个n种颜色的梯度。我们还可以使用scaledistiller()和scale*_viridis()来分别使用RColorBrewer和viridis包的颜色。我们可以用viridis比例尺绘制SID74的地图,如下所示(图2.9)。

library(viridis) 
map <- st_as_sf(map) 
ggplot(map) + geom_sf(aes(fill = SID74)) + scale_fill_viridis() + theme_bw()

在这里插入图片描述

要保存由ggplot2生成的图形,可以使用ggsave()函数。或者,我们可以通过指定设备驱动程序(例如,png, pdf)来保存plot,打印plot,然后使用dev.off()关闭设备:

png("plot.png") 
ggplot(map) + geom_sf(aes(fill = SID74)) + scale_fill_viridis() + theme_bw() 
dev.off()

此外,软件包ganimate(Pedersen和Robinson,2019)和plotly(Sievert等人,2019)可以与ggplot2结合使用,分别创建动画图和互动图。

  • 2.4.2 leaflet

Leaflet 2是一个非常流行的用于交互式地图的开源JavaScript库。R包leaflet(https://rstudio.github.io/leaflet/)使得在R中集成和控制Leaflet地图变得容易。我们可以通过调用leaflet()函数来创建一个地图,然后通过使用层函数向地图添加层。例如,我们可以使用addTiles()来添加一个背景地图,addPolygons()来添加多边形,addLegend()来添加一个图例。我们可以使用各种背景图。例子可以在图例提供者的网站上看到3。一个SID74的地图,其色阶由RColorBrewer包的调色板 "YlOrRd "给出,可以按如下方法创建。首先,我们将具有EPSG代码4267的投影的地图转换为EPSG代码4326的投影,这是leaflet要求的投影。我们通过使用sf包的st_transform()函数来实现这一目的。

st_crs(map)

结果:
Coordinate Reference System:

EPSG: 4267 proj4string: “+proj=longlat +datum=NAD27 +no_defs”

map <- st_transform(map, 4326)

然后,我们使用colorNumeric()创建一个调色板,并使用leaflet(), addTiles()和addPolygons()函数绘制地图,指定多边形的边框颜色(color)和多边形的颜色(fillColor),不透明度(fillOpacity)和图例(图2.10)。

library(leaflet)
pal <- colorNumeric("YlOrRd", domain = map$SID74)

leaflet(map) %>%
	addTiles() %>% 
	addPolygons(
		color = "white", fillColor = ~ pal(SID74),
		fillOpacity = 1 
	) %>% 
	addLegend(pal = pal, values = ~SID74, opacity = 1)

在这里插入图片描述

要将创建的映射保存到HTML文件中,我们可以使用htmlwidgets包的saveWidget()函数(Vaidyanathan等人,2018)。如果我们希望保存地图的图像,我们首先用saveWidget()将其保存为HTML文件,然后使用webshot包的webshot()函数捕获HTML的静态版本(Chang, 2018)。

  • 2.4.3 mapview

mapview包(https://r-spatial.github.io/mapview/)允许非常快速地创建交互式可视化,以研究数据中的空间几何和变量。例如,我们可以创建一个显示SID74的地图,只需使用mapview()函数,参数映射对象和我们想要显示的变量(zcol = “SID74”)(图2.11)。这个地图是交互式的,通过点击每个县,我们可以看到弹出的数据中其他变量的信息。

library(mapview) 
mapview(map, zcol = "SID74")

在这里插入图片描述

Mapview非常方便,可以非常快速地检查空间数据,但创建的地图也可以通过添加图例和背景地图等元素来定制。此外,我们可以创建显示多个层和合并同步的可视化效果。例如,我们可以创建一个背景地图“CartoDB”的地图。来自RColorBrewer包的调色板“YlOrRd”的颜色如下所示(图2.12):

library(RColorBrewer) 
pal <- colorRampPalette(brewer.pal(9, "YlOrRd")) 
mapview(map,zcol = "SID74",map.types = "CartoDB.DarkMatter",col.regions = pal )

在这里插入图片描述

我们还可以使用sync()函数来生成一个网格状的视图,该视图包含多个用mapview或leaflet创建的同步地图。首先使用mapview()创建变量SID74和SID79的地图,然后将这些地图作为sync()函数的参数传递(图2.13),通过同步缩放和平移创建1974年和1979年婴儿猝死的地图。

m74 <- mapview(map, zcol = "SID74") 
m79 <- mapview(map, zcol = "SID79") 
m <- sync(m74, m79) 
m

在这里插入图片描述
我们可以保存使用mapview创建的地图,方式与使用传单创建的地图相同(使用saveWidget()和webshot())。或者,地图可以使用mapshot()函数保存为HTML文件或PNG、PDF或JPEG图像。

  • 2.4.4 tmap
    tmap包用于生成具有极大灵活性的专题地图。映射是通过使用tm_shape()函数和使用tm_*()函数添加图层来创建的。此外,我们可以通过分别设置tmap_mode(“plot”)和tmap_mode(“view”)来创建静态或交互式映射。例如,可以创建如下的SID74交互式地图(图2.14):
library(tmap) 
tmap_mode("view") 
tm_shape(map) + tm_polygons("SID74")

在这里插入图片描述
这个包还允许创建具有多个形状和层的可视化效果,并指定不同的样式。要保存使用tmap创建的地图,可以使用tmap_save()函数,其中需要指定HTML文件的名称(视图模式)或图像(绘图模式)。有关tmap的更多信息可以在包的小插图4中看到。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangboy666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值