You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 20:55:58