如何用tmap基于邻接列表绘制多边形邻居网格图?
问题描述
我想要使用tmap包绘制多边形连接网格图,该示例图来自Michael Harper的博客,原代码通过base R的plot()函数结合spdep包的poly2nb()生成的邻接列表绘制连线。但我无法在tmap中复现第二个plot()命令的效果,请问能否通过spdep::poly2nb()或tmaptools::get_neighbours()生成的邻接列表,让tmap绘制点间连线?
解决方案
可以实现,核心是把邻接列表转换成tmap可识别的线要素,具体步骤如下:
1. 准备基础数据与邻接关系
以sf内置的示例多边形数据为例,加载工具包并生成邻接列表:
library(sf) library(tmap) library(spdep) # 读取示例多边形数据 nc <- st_read(system.file("shape/nc.shp", package="sf")) # 用spdep生成邻接列表(queen规则) nb <- poly2nb(nc, queen = TRUE) # 若用tmaptools生成邻接列表,替换为以下代码 # library(tmaptools) # nb <- get_neighbours(nc, queen = TRUE)
2. 将邻接列表转为线要素
把每个邻接对对应的多边形中心点连接成线:
# 计算多边形中心点 centroids <- st_centroid(nc) # 把邻接列表转为线数据结构 edges <- nb2lines(nb, coords = st_coordinates(centroids)) # 转为sf格式的线对象 edges_sf <- st_as_sf(edges)
3. 用tmap叠加绘制多边形与连线
现在可以将多边形底图和邻接连线叠加展示:
tm_shape(nc) + tm_polygons(col = "white", border.col = "gray") + tm_shape(edges_sf) + tm_lines(col = "darkred", lwd = 0.8) + tm_layout(frame = FALSE)
额外调整说明
- 若要修改连线样式,直接调整
tm_lines()的col(颜色)、lwd(粗细)等参数即可 - 需排除特定邻接关系时,可在生成
edges_sf后,通过筛选数据框的方式移除对应行
内容的提问来源于stack exchange,提问作者John J.
相关产品推荐
相关产品推荐

