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

修改tmap中阴影线多边形(线串模拟)的图例样式

解决方案:让tmap图例匹配阴影线图案

因为tmap默认的线图层图例只会显示单条线,没法匹配你用hatchedLayer生成的阴影线效果,这里提供一个直接的解决方法——用自定义图例符号来模拟阴影线图案,完美匹配地图中的样式。

方法:用grid包创建自定义阴影线图例

核心思路是:先关闭线图层的默认图例,然后用tm_add_legend添加一个带阴影线的自定义图例项,参数和地图中的阴影线保持一致。

完整代码如下:

library(sf)
library(cartography)
library(tmap)
library(tidyverse)
library(grid) # 用来做自定义图例的图形对象

# 加载NC数据集
nc <- st_read(system.file("shape/nc.shp", package="sf"), quiet = TRUE) 

# 生成目标区域的阴影线线串
ASHE_HASH <- hatchedLayer(
  x = nc %>% filter(NAME=="Ashe"), 
  pattern = "diamond", 
  mode="sfc", 
  density=0.25, 
  lwd=2.5
) %>%
  st_as_sf() %>%
  mutate(label="test hatch")

# 创建和地图中一致的阴影线图例图形
hatch_legend_grob <- grobTree(
  # 先画白色矩形当背景
  rectGrob(gp = gpar(fill = "white", col = NA)),
  # 加上菱形阴影线,参数和生成地图阴影时完全一致
  hatchedGrob(
    width = unit(1, "npc"), 
    height = unit(1, "npc"),
    pattern = "diamond", 
    density = 0.25, 
    lwd = 2.5, 
    col = "black"
  )
)

# 绘制地图并添加自定义图例
tmap_mode("plot")

tm_shape(nc) +
  tm_polygons(col = "NAME") +
  tm_shape(ASHE_HASH) +
  tm_lines(col="label", palette = "black", lwd = 2, legend.show = FALSE) + # 关掉默认的线图例
  tm_add_legend(
    type = "custom",
    labels = "test hatch",
    grobs = hatch_legend_grob,
    title = "调查区域" # 这里可以改你需要的图例标题
  )

关键说明:

  • 用grid::grobTree把白色背景和阴影线组合成一个图形对象,保证图例样式和地图里的阴影线完全匹配;
  • 通过legend.show = FALSE关闭tm_lines自带的线图例,避免出现两个图例;
  • 如果需要调整图例大小,直接修改rectGrob和hatchedGrob里的width/height参数就行。

交互式地图的补充:

如果切换到view模式做交互式地图,由于Leaflet本身不支持这种自定义图案图例,这个方法没法直接用。要是必须兼顾交互式,只能退而求其次用半透明多边形填充来标记区域,但如果更看重阴影线效果,静态地图的这个方案完全能满足你统一工作流的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:23:16