微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 tmap 为单值数据创建全尺寸颜色条?

如何解决如何使用 tmap 为单值数据创建全尺寸颜色条?

我需要使用 tmap 生成不同的地图。要创建一个连续的颜色条,我使用 style = "cont" 连同定义的中断 (breaks = seq(0,100,25)))。

如果我的数据显示出一些变化(见下面的地图 1),这很有效。但是,我也有各个多边形之间没有变化的数据(参见地图 2)。尽管如此,为了进行直接比较,我希望为地图 1(0 到 100 之间的全范围)绘制颜色条,也为地图 2。

到目前为止,我没有找到解决该问题的解决方案。有什么想法吗?

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

makeMap <- function(data){
  tm_shape(data) +
  tm_fill("par",palette = "RdYlGn",style = "cont",breaks = seq(0,25)) +
  tm_layout(legend.text.size = 1.5,legend.bg.color = "white",legend.bg.alpha = .8) +
  tm_borders(lwd = 1,col = "black")
}

# map 1
states_sf1 <- get_urbn_map("states",sf = TRUE) %>%  
  as.tibble() %>% 
  mutate(par = runif(51,100)) %>% 
  st_as_sf() 

makeMap(states_sf1)

# map 2
states_sf2 <- get_urbn_map("states",sf = TRUE) %>%  
  as.tibble() %>% 
  mutate(par = 10) %>% 
  st_as_sf() 

makeMap(states_sf2)

地图 1

enter image description here

地图 2

enter image description here

解决方法

我没有找到使用 tmap 的解决方案,请参阅此处使用 ggplot2 的替代方法。关键是在 limits 上设置 scale_fill_gradientn

library(tidyverse)
library(sf)
#> Linking to GEOS 3.9.0,GDAL 3.2.1,PROJ 7.2.1
library(urbnmapr)

makeMap <- function(data){
  ggplot(data) +
    geom_sf(aes(fill=par)) +
    scale_fill_gradientn(colours = hcl.colors(5,"RdYlGn"),breaks = seq(0,100,25),limits=c(0,100)) +
    guides(fill = guide_colorbar(reverse = TRUE))+
    theme_void()
}

# map 1
states_sf1 <- get_urbn_map("states",sf = TRUE) %>%  
  as.tibble() %>% 
  mutate(par = runif(51,100)) %>% 
  st_as_sf() 
#> Warning: `as.tibble()` was deprecated in tibble 2.0.0.
#> Please use `as_tibble()` instead.
#> The signature and semantics have changed,see `?as_tibble`.

makeMap(states_sf1)

# map 2
states_sf2 <- get_urbn_map("states",sf = TRUE) %>%  
  as.tibble() %>% 
  mutate(par = 25) %>% 
  st_as_sf() 

makeMap(states_sf2)

reprex package (v2.0.0) 于 2021 年 6 月 18 日创建

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。