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

如何在tmap图例中呈现三种不同样式的多边形边界?

问题:如何在tmap中添加边界样式的自定义图例?

用户提供的绘图代码如下:

# import shapefile
shape_data <- system.file("shape/nc.shp", package="sf")
shape_data <- st_read(shape_data) 
sample_data <- filter(shape_data, CNTY_ID >2100)
shape_area <- st_union(shape_data) 
#map data
tm_shape(shape_data) + tm_borders(alpha = 0.4,lwd = 0.1, col = "blue") +
tm_fill(col = "BIR79", style = "equal") +
tm_shape(sample_data)  + tm_borders(col = "red", lwd = 3, lty = 4) +
tm_shape(shape_area) + tm_borders(col = "black", lwd = 2)

该地图包含三种不同样式的多边形边界:蓝色细边框(对应全部县)、红色粗虚线框(对应CNTY_ID>2100的县)、黑色粗边框(对应整体区域范围),需要在图例中添加这三种边界的样式及对应说明,可附加在数据图例旁或单独生成,请教如何用tmap实现?


实现方案

tmap没有直接给tm_borders绑定图例的原生参数,但可以通过tm_add_legend()手动构建自定义线样式图例,精准匹配地图中的边界样式。

修改后的完整代码

library(sf)
library(tmap)
library(dplyr)

# 读取并处理数据
shape_data <- system.file("shape/nc.shp", package="sf")
shape_data <- st_read(shape_data) 
sample_data <- filter(shape_data, CNTY_ID > 2100)
shape_area <- st_union(shape_data) 

# 绘图+添加自定义图例
tm_shape(shape_data) + 
  tm_borders(alpha = 0.4, lwd = 0.1, col = "blue") +
  tm_fill(col = "BIR79", style = "equal", title = "1979年出生人口") +
  tm_shape(sample_data) + 
  tm_borders(col = "red", lwd = 3, lty = 4) +
  tm_shape(shape_area) + 
  tm_borders(col = "black", lwd = 2) +
  # 手动添加边界样式图例
  tm_add_legend(type = "line",
                labels = c("全部县边界", "重点县边界", "区域整体范围"),
                col = c("blue", "red", "black"),
                lwd = c(0.1, 3, 2),
                lty = c(1, 4, 1),
                alpha = c(0.4, 1, 1),
                title = "边界说明")

关键参数说明

  • type="line":指定图例项为线样式,匹配边界的属性
  • labels:按顺序填写三种边界的说明文字
  • col/lwd/lty/alpha:分别对应地图中三种边界的颜色、线宽、线型、透明度,确保样式完全一致
  • 若需调整图例位置,可在tm_add_legend()中加入position=c("right", "top"),或用tm_layout(legend.position=c("right", "top"))统一管理所有图例位置

内容的提问来源于stack exchange,提问作者Ramon_88

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 21:55:25