【问题标题】:duplicated colors in legend of tmap object in RR中tmap对象图例中的重复颜色
【发布时间】:2021-12-17 23:04:11
【问题描述】:

有人在R 中遇到过tmap 的此类问题吗?见下图。无论我尝试哪种风格(prettykmeansjenks 等等),图例中总是存在重复的颜色。我也试过设置midpoint = NA,但问题依旧。

这是我用来创建这样一个情节的代码。代码下方是用于绘图的向量。抱歉 dput 似乎不适用于 sf 对象。请随意使用任何空间数据来复制示例。反馈总是appriciated!

tm_shape(sfpr) + tm_borders(col = "gray") + 
  tm_polygons(col = 'Pperc', 
              style = "kmeans",
#              midpoint = NA,
              palette = viridis(4, 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"), 
            legend.format = list(digits = 0), 
            main.title = "Maps on the reduction of phosphate losses (in 1000 lbs)", 
            main.title.position = "center")
> sfpr$Pperc
 [1]   -1.49   -0.02    0.12    0.27   -0.36 -247.86  -21.74   -8.88   28.63  -14.48   -0.56

【问题讨论】:

  • 您有 4 种颜色,但有 5 个图例类。您可以尝试至少 5 种颜色:viridis(6, ...)
  • @Eyayam,当我更改为 viridis(5, ...) 时,它起作用了,即没有出现重复的颜色。但是viridis(6, ...) 没有用。另外,如果我只是使用palette = 'viridis',重复的颜色会再次出现。
  • 你试过style='cont'吗?
  • @Eyayaw 没有这种风格。你指的是cat吗?
  • style.args="cont" 用于连续缩放。

标签: r tmap


【解决方案1】:

问题是由数据集中的负值和正值引起的。如果您设置auto.palette.mapping = T(已弃用)或为midpoint 使用不同的数值,这将解决您的问题。我根据您的最小/最大值生成了一些虚拟数据。顺便说一句,您应该使用tm_borders() + tm_fill() 或只使用tm_polygons(),因为后者会填充多边形并绘制轮廓。

library(tidyverse)
library(tmap)
library(sf)
library(urbnmapr)
library(viridis)

# create dummy data
sfpr <- get_urbn_map("states", sf = T) %>%  
  as.tibble() %>% 
  mutate(Pperc = runif(51, -248 ,29)) %>% 
  st_as_sf() 

tm_shape(sfpr) +
  tm_borders(col = "gray") + 
  tm_fill("Pperc",
          style = "kmeans",
          palette = viridis(4, begin = 0.48, end = 1), 
          auto.palette.mapping = T) +
  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"), 
            legend.format = list(digits = 0), 
            main.title = "Maps on the reduction of phosphate losses (in 1000 lbs)", 
            main.title.position = "center")

【讨论】:

  • 感谢您的意见!根据文档,如果指定了midpoint,调色板将被视为发散的。但是,这里需要的是顺序的。这就是我设置midpoint = NA 以保持顺序调色板的原因。这对你有意义吗?