R语言 如何在geom_sf中仅对过滤值使用填充美学,而“排除”和“NA”值均在Map上以其他颜色显示

tp5buhyn  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(87)

我想使用Spectral调色板从RColorBrewer只为面积大于0.1,但我也想显示面积小于0.1,让我们说深灰色,甚至更好的阴影。除此之外,我想将NA渲染为浅灰色。所以基本上,没有值留在Map中;它们只能得到不同的颜色。我试过下面两种方法,但没有一种是我想要的。会很感激你的帮助。

library(ggnewscale)
library(tidyverse)
library(sf)

nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), 
                  quiet = TRUE)

# add some NAs
nc$AREA[c(1,2,3)] <- NA

# first try
ggplot(nc) +
  geom_sf(aes(fill = AREA > 0.1)) +
  new_scale_fill() +
  geom_sf(aes(fill = AREA))+
  scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, "Spectral"),
                       na.value = "grey90")
# second try
remove_col <- "AREA"
remove_val <- 0.1

nc %>%
  filter(.data[[remove_col]] < remove_val) %>%
  ggplot() +
  geom_sf(aes(fill = AREA)) +
  new_scale_fill() +
  geom_sf(aes(fill = .data[[remove_col]]), color = "black") +
  scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, "Spectral"),
                       na.value = "grey90")

字符串

6bc51xsx

6bc51xsx1#

如果从图例中保留NA< .1是可以接受的,我们可以跳过ggnewscale。首先让我们为scale_fill_gradientn()c(.1, NA)设置限制,限制之外的所有内容都用na.value填充。然后添加另一个层,只添加缺少AREA值和常量填充的多边形:

library(dplyr)
library(ggplot2)

nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), 
                  quiet = TRUE)

# add some NAs
nc$AREA[c(1,2,3)] <- NA

ggplot(nc) +
  geom_sf(aes(fill = AREA))  +
  scale_fill_gradientn(colors = RColorBrewer::brewer.pal(9, "Spectral"),
                       limits = c(.1, NA),
                       na.value = "darkgrey") +
  geom_sf(data = ~ filter(.x, is.na(AREA)), fill = "lightgrey")

字符串
x1c 0d1x的数据
创建于2023-07-25带有reprex v2.0.2

相关问题