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

