修改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
相关产品推荐
相关产品推荐

