R语言tmap绘制空间地图时图例出现重复颜色问题如何解决?
问题原因
你遇到的图例颜色重复问题本质是两个因素叠加导致的:
- 你的
Pperc字段存在极端离群值-247.86,和其他数值的范围差非常大,自动分箱算法会单独为这个离群值分配一个分箱区间,剩余数值集中在-22~28的小范围内,自动划分的区间间隔极小 - 你设置了
legend.format = list(digits = 0)强制图例标签取整,间隔极小的分箱区间上下限取整后显示完全相同,视觉上就会出现“同一个区间对应多个重复颜色”的错觉,并不是真的颜色映射重复。
解决方案
你可以按需选择以下任意一种方法修复:
- 手动指定分箱断点,替代自动分箱算法:根据你的数值范围自定义断点,同时保证颜色数量和分箱数(断点数量-1)完全匹配,避免自动分配出现偏差
- 调整图例小数位数:将
legend.format的digits参数调整为1或2,显示原始区间的真实数值,避免取整导致的标签重叠 - 预处理极端离群值:将远小于常规范围的异常值单独归为一类,比如把所有小于-50的数值统一标注为“≤-50”,避免单个异常值占用一个分箱浪费颜色位
修复后代码示例
library(tmap) library(viridis) # 自定义分箱断点和标签,适配你的数值范围 custom_breaks <- c(-250, -20, 0, 10, 30) custom_labels <- c("-250~-20", "-20~0", "0~10", "10~30") tm_shape(sfpr) + tm_borders(col = "gray") + tm_polygons(col = 'Pperc', breaks = custom_breaks, labels = custom_labels, palette = viridis(length(custom_breaks) - 1, begin = 0.48, end = 1)) + tm_layout(inner.margins = c(0.1, 0.15, 0.1, 0.1), legend.title.size = 1.5, legend.text.size = 1.1, legend.position = c("left", "bottom"), main.title = "Maps on the reduction of phosphate losses (in 1000 lbs)", main.title.position = "center")
内容的提问来源于stack exchange,提问作者Yabin Da
相关产品推荐
相关产品推荐

