手动指定tmap中的图例类别数,包括未表示的类别

Manually specify the number of legend categories in tmap, including unrepresented categories

我正在尝试为多边形地图和整数变量指定一个简单的图例,其中并非范围内的所有值都存在。我需要这个以便在范围和特定值都不同的可比较地图上具有相同的图例和相同的色标。例如,变量的最大值在任何地图上都是 8。我希望图例显示值 0 到 8,即使 6 或任何特定值不存在任何多边形,我希望图例上的标签为 0 到 8,包括在内,没有合并。

一个可复制的例子:

library(tmap)
library(dplyr)
library(sf)
set.seed(1234)

shape <- st_read(system.file("shape/nc.shp", package ="sf")) %>% 
  st_transform(shape, crs = 4326)
shape$myvar <- as.integer(sample(x=c(c(base::rep(c(0,1,2,3,4),16),base::rep(5,15),c(7,7,7,7,8)))))

table(shape$myvar)
0  1  2  3  4  5  7  8 
16 16 16 16 16 15  4  1 

我尝试了很多变体,但在这种情况下无法获得九个类别以及相应的标签。

mymap <- tm_shape(shape) +
  tm_fill(col = "myvar",
          style = "cat",
          breaks = c(0,1,2,3,4,5,6,7,8),
          n=9)
mymap

此图例缺少值 6。

相比之下,使用 style = 'fixed' 选项是这样的:

mymap <- tm_shape(shape) +
  tm_fill(col = "myvar",
          style = "fixed",
          breaks = c(0,1,2,3,4,5,6,7,8),
          n=9)
mymap

此处的图例具有值“6”的类别,但合并了最后两个类别。

我试着在 tm_fill 中加入一个额外的参数:

 style.args = classIntervals(var=shape$myvar,n=9)

这并没有改变之前地图的输出。

尽我所能,我无法获得所有 9 个类别。

有人可以给我一些建议,告诉我如何在不使用 GIMP 的情况下获得我想要的简单图例吗?

请使用 tmap 找到以下一种可能的解决方案:

Reprex

  • 您的数据
library(tmap)
library(dplyr)
library(sf)

set.seed(1234)

shape <- st_read(system.file("shape/nc.shp", package ="sf")) %>% 
  st_transform(shape, crs = 4326)
shape$myvar <- as.integer(sample(x=c(c(base::rep(c(0,1,2,3,4),16),base::rep(5,15),c(7,7,7,7,8)))))
  • 建议代码
mymap <- tm_shape(shape) +
  tm_fill(col = "myvar",
          style = "fixed",
          breaks = c(0,1,2,3,4,5,6,7,8,+Inf), 
          labels = c("0","1","2","3","4","5","6","7","8")) +
  tm_layout(inner.margins = c(0.02, 0.08, 0.02, 0.02))

mymap

reprex package (v2.0.1)

于 2022-03-04 创建