地图对于传达地理空间信息非常有用。在此,我们介绍一些简单的例子,展示一些常用的软件包的使用。
在R中常用于制图的一些包,即ggplot2、leaflet、mapview和tmap。在本书的其余部分,我们将展示如何使用ggplot2和leaflet包创建更复杂的地图,以可视化几个应用程序的结果。
- 2.4.1 ggplot2
ggplot2(https://ggplot2.tidyverse.org/)是一个基于图形的语法来创建图形的包。这意味着我们可以使用ggplot()函数和以下元素来创建一个图。
-
我们想要可视化的数据。
-
代表数据的几何形状,如点或条。形状是用geom_*()函数来指定的。例如,geom_point()用于表示点,geom_histogram()用于表示柱状图。
-
aes()用于将数据中的变量映射到对象的视觉属性,如颜色、大小、形状和位置。
-
可选的元素,如比例尺、标题、标签、图例和主题。
我们可以通过使用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中看到。