如何在tmap中设置固定手动调色板?地图配色不一致求助
嘿,这个问题我之前做多地图对比的时候也踩过坑!tmap的颜色映射逻辑和ggplot确实不一样,直接搬scale_colour_manual肯定不管用,不过有两个简单靠谱的办法能让同一类别在两张地图上颜色完全一致,我给你一步步说:
方法一:创建固定键值对的颜色映射表(最推荐)
先手动给每个类别绑定好固定颜色,做成一个命名向量,这样不管两张数据集里的类别顺序、是否有缺失,tmap都会精准匹配颜色:
# 第一步:定义全局颜色映射,键是类别名称,值是对应颜色(可以用十六进制色码或内置色名) fixed_colors <- c( "c" = "blue", # 给类别c固定蓝色 "d" = "red", # 给类别d固定红色 "a" = "forestgreen",# 其他类别也可以提前定义好 "b" = "orange" ) # 第二步:绘制第一张地图,直接用这个映射表 tm_shape(your_first_data) + tm_fill(col = "category", palette = fixed_colors) + # 核心是palette参数指定我们的映射表 tm_layout(title = "地图1:类别分布") # 第三步:绘制第二张地图,用完全相同的fixed_colors tm_shape(your_second_data) + tm_fill(col = "category", palette = fixed_colors) + tm_layout(title = "地图2:类别对比")
这个方法的好处是绝对精准,哪怕某张地图里没有某个类别(比如地图2里没有a类),也不影响其他类别的颜色匹配。
方法二:统一因子水平后用顺序调色板
如果你的类别是因子类型,可以先把两张数据集的因子水平统一,再用顺序对应的调色板:
# 第一步:收集所有可能的类别,统一两张数据的因子水平 all_categories <- unique(c(your_first_data$category, your_second_data$category)) your_first_data$category <- factor(your_first_data$category, levels = all_categories) your_second_data$category <- factor(your_second_data$category, levels = all_categories) # 第二步:定义和因子水平顺序对应的颜色向量 color_palette <- c("blue", "red", "forestgreen", "orange") # 顺序要和all_categories完全一致 # 第三步:绘制两张地图,用这个调色板 tm_shape(your_first_data) + tm_fill(col = "category", palette = color_palette) + tm_layout(title = "地图1") tm_shape(your_second_data) + tm_fill(col = "category", palette = color_palette) + tm_layout(title = "地图2")
额外提醒:tmap里的scale_fill_manual用法
其实tmap也支持scale_fill_manual,但语法和ggplot略有不同,你之前可能是用法不对,比如正确写法是:
tm_shape(your_data) + tm_fill(col = "category") + scale_fill_manual(values = fixed_colors) # 这里的values就是我们的颜色映射表
不过还是更推荐直接在tm_fill()里用palette参数,代码更简洁直观。
内容的提问来源于stack exchange,提问作者Glomek




