如何在R的tmap中为分组区域添加外边框并设置单标签?
复刻地图的问题解决方案
你想要复刻目标地图,当前代码生成的地图存在两个待解决的问题:移除省份内部边框并为每个区域添加白色外边框,以及每个区域仅显示一个标签。以下是具体的解决方法和修改后的代码:
1. 数据预处理:合并区域面要素
原数据是省级面要素,要实现区域级的边框和单标签,需先将同一Region下的省份合并为单个面要素(使用sf对象处理更便捷):
# 加载所需包 library(tidyverse) library(tmap) library(sf) library(rgdal) # 设置工作路径 setwd("C:\\Users\\Dell\\Desktop\\Regiones de Saud") # 读取SHP文件并转换为sf对象 prov <- readOGR("RD_PROV.shp") %>% st_as_sf() # 为省份分配所属区域(逻辑与原代码一致) prov$Region <- NA prov$Region[prov$TOPONIMIA %in% c("DISTRITO NACIONAL", "SANTO DOMINGO", "MONTE PLATA")] <- "Region 0" prov$Region[prov$TOPONIMIA %in% c("PERAVIA", "SAN CRISTÓBAL", "SAN JOSÉ DE OCOA")] <- "Region I" prov$Region[prov$TOPONIMIA %in% c("SANTIAGO", "PUERTO PLATA", "ESPAILLAT")] <- "Region II" prov$Region[prov$TOPONIMIA %in% c("DUARTE", "SAMANÁ", "MARÍA TRINIDAD SÁNCHEZ","HERMANAS MIRABAL")] <- "Region III" prov$Region[prov$TOPONIMIA %in% c("INDEPENDENCIA", "BAORUCO", "BARAHONA","PEDERNALES")] <- "Region IV" prov$Region[prov$TOPONIMIA %in% c("LA ALTAGRACIA", "LA ROMANA", "EL SEIBO","SAN PEDRO DE MACORIS","HATO MAYOR")] <- "Region V" prov$Region[prov$TOPONIMIA %in% c("AZUA", "SAN JUAN", "ELÍAS PIÑA")] <- "Region VI" prov$Region[prov$TOPONIMIA %in% c("DAJABÓN", "MONTE CRISTI", "SANTIAGO RODRIGUEZ","VALVERDE")] <- "Region VII" prov$Region[prov$TOPONIMIA %in% c("LA VEGA", "MONSEÑOR NOUEL", "SÁNCHEZ RAMÍREZ")] <- "Region VIII" # 按Region合并面要素,生成区域级空间数据 regions <- prov %>% group_by(Region) %>% summarise(geometry = st_union(geometry)) %>% ungroup()
2. 绘制符合要求的地图
通过分层绘制实现需求:
- 底层:用合并后的区域数据绘制白色外边框
- 中层:用省级数据绘制无内部边框的填充色
- 顶层:用区域级数据添加单个标签
tm_shape(regions) + # 绘制区域白色外边框,无填充色 tm_polygons(border.col = "white", border.lwd = 2, col = NA) + tm_shape(prov) + # 绘制省级填充区域,隐藏内部边框 tm_polygons("Region", border.col = "transparent") + tm_shape(regions) + # 为每个区域添加单个居中标签 tm_text("Region", size = 1, fontface = "bold")
关键逻辑说明
- 移除内部边框:在省级面的
tm_polygons中设置border.col = "transparent",直接隐藏省份之间的内部线条。 - 添加区域外边框:利用合并后的区域数据单独绘制白色边框,可通过
border.lwd参数调整边框粗细。 - 单区域标签:基于合并后的区域数据调用
tm_text,每个区域仅对应一个面要素,因此只会显示一次标签,默认在区域几何中心位置。
内容的提问来源于stack exchange,提问作者almr27
相关产品推荐
相关产品推荐

