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

R语言tmap绘图:如何按类别区分点图层并修改图例

解决tmap中单图层按类别区分点样式并自定义图例的问题

我明白你想要用单个tm_dots()图层实现按点位类别(比如Informal或Commercial)区分样式,避免重复添加多个图层,同时还要调整点图例的名称,另外还要处理NA值的显示问题。下面是具体的解决方案:

1. 先关联分类数据到空间对象

首先,你需要把包含点位分类(Classification)的数据关联到bristol这个空间对象中。假设你的分类数据存储在offices数据框里,且两者有共同的关联字段(比如id),可以用left_join完成合并:

# 合并分类字段到空间对象
bristol <- left_join(bristol, offices, by = "id")

这样bristol就会包含Classification字段,供后续的tm_dots()调用。

2. 修改tm_dots()参数实现需求

接下来调整tm_dots()的参数,实现单图层按类别区分样式、自定义图例名称和隐藏NA值的效果:

  • 用col="Classification"指定按分类字段着色,自动为不同类别分配不同颜色
  • 用palette指定适合分类数据的调色板(比如"Set1")
  • 用colorNA = NULL彻底隐藏NA值对应的点(亲测比showNA=NA更有效)
  • 用title参数直接修改点图例的名称,替换成你想要的内容

完整修改后的代码

tm_shape(bristol) + 
  tm_fill("population", 
          palette = "YlOrRd", 
          auto.palette.mapping = TRUE, 
          title = "Bristol Population", 
          breaks = c(0,5,10,15,20,25), 
          colorNA = "darkgrey") + 
  tm_borders("grey25", alpha = 0.7, lwd = 0.1) + 
  tm_dots(size=0.1,
          col="Classification", 
          palette = "Set1", 
          colorNA = NULL, 
          title = "Point Categories") + # 这里自定义图例名称
  tm_legend(text.size=1, title.size=1.2, position=c("left","top")) + 
  tm_layout(legend.outside = TRUE, legend.outside.position = "bottom", title.snap.to.legend = TRUE)

关键说明

  • 单个tm_dots()图层就能完成按类别区分样式的需求,不需要重复添加多个tm_dots()
  • colorNA = NULL解决了NA值点的显示问题,不会再出现多余的NA点
  • title参数直接修改点图例的名称,完全符合你的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:57:19