Объединить категориальное и градиентное заполнение в геопространственной - R - PullRequest
0 голосов
/ 03 ноября 2018

Я пытаюсь заполнить объединенную категориальную и непрерывную переменную на карте. Так, например, в моем минимально воспроизводимом примере ниже, скажем, я хочу отобразить количество магазинов пончиков KrispyKreme в каждом округе, которое обычно является непрерывной переменной, которую я хочу заполнить по градиенту. Но у меня также есть округа, которые запрещают KrispyKremes, обозначенные «-1», и те, которые строят их «-2». Я хочу отобразить их другим цветом, не отображенным на градиенте. У меня также есть NA в моих реальных данных.

- Что у меня есть до сих пор:

library(sf)
library(ggplot2)

nc <- st_read(system.file("shape/nc.shp", package="sf"))
nc$Status<-rep(c(-2,-1,runif(8)), 10)

ggplot(nc) + 
  geom_sf(aes(fill=Status),color = "black") + 
  coord_sf(datum = NA) + 
  theme_minimal()

Разрыв, если я добавлю следующую строку, очевидно. Итак, я знаю, что у меня неправильный синтаксис, но он указывает на то, что я хочу сделать как можно лучше, насколько я могу изобразить код для этого

  scale_fill_manual(breaks= c("-2","-1", >=0),values = c("blue", "yellow", scale_fill_viridis()))

Любая помощь очень ценится, я был на этом весь день.

1 Ответ

0 голосов
/ 17 ноября 2018

Вам нужно будет разделить вашу непрерывную переменную на разные категории.

library(sf)
library(ggplot2)
library(dplyr)

# Set seed for reproducibility
set.seed(122)

nc <- st_read(system.file("shape/nc.shp", package="sf"))
nc$Status<-rep(c(-2,-1,runif(8)), 10)

Сначала проверьте распределение вашей переменной.

nc %>%
  filter(Status >= 0) %>%
  pull("Status") %>%
  summary()
#     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
# 0.002789 0.153144 0.602395 0.491287 0.735787 0.906851

Я решил вырезать переменную на основе квантиля следующим образом.

nc2 <- nc %>%
  mutate(Status2 = case_when(
    Status == -2 ~ "-2",
    Status == -1 ~ "-1",
    Status >= 0 & Status < 0.15 ~ "0 - 0.15",
    Status >= 0.15 & Status < 0.6 ~ "0.15 - 0.6",
    Status >= 0.6 & Status < 0.75 ~ "0.6 - 0.75",
    Status >= 0.75                ~ "0.75 - 0.91"
  ))

Теперь Status2 является категориальной переменной. Мы можем построить его и использовать scale_fill_manual для предоставления цветов. Обратите внимание, что нам нужно предоставить цветовой код в аргументе values. viridis::viridis(4) - генерировать четыре цвета на основе виридов.

ggplot(nc2) + 
  geom_sf(aes(fill=Status2),color = "black") + 
  coord_sf(datum = NA) + 
  theme_minimal() +
  scale_fill_manual(values = c("blue", "yellow", viridis::viridis(4)))

enter image description here

...