Объединить категориальное и градиентное заполнение в геопространственной - R
Я пытаюсь заполнить объединенную категориальную и непрерывную переменную на карте. Так, например, в моем минимально воспроизводимом примере ниже, скажем, я хочу отобразить количество магазинов пончиков 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 ответ
Вам нужно будет разрезать вашу непрерывную переменную на разные категории.
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)))
Большое спасибо за это. ПутьStatus2
был построен выше, делает его символьной переменной. Вместо этого я хотел бы построить категориальную переменную. В приведенном ниже коде вместо этого создается факторная переменная (Status3
) и наносит на карту. Оно работает.
library(sf)
library(ggplot2)
library(dplyr)
nc <- st_read(system.file("shape/nc.shp", package="sf"))
nc$Status<-rep(c(-2,-1,runif(8)), 10)
nc3 <- nc %>%
mutate(Status3 = factor(ifelse(Status>0,1,0)))
ggplot(nc3) +
geom_sf(aes(fill=Status3),color = "black") +
coord_sf(datum = NA) +
theme_minimal()
Однако, когда я пытаюсь применить то же обоснование (построить факторную переменную на основе непрерывной переменной и построить ее карту) к моему коду, я получаю сообщение об ошибке.
Ошибка в if (type == "point") {: аргумент имеет нулевую длину
Мой код ниже. Код работает при построении непрерывной переменной, но не при построении факторной переменной. Кто-нибудь знает почему?
# plotting continuous variable: WORKS FINE
ggplot(CS_mun_shp)+
geom_sf(aes(geometry=geometry,
fill=ppc_sih),
color=NA)
# constructing factor variable
CS_mun_shp2 <- CS_mun_shp %>%
mutate(cs_above40=factor(ifelse(ppc_sih>=0.4,1,0),
levels=c(0:1),
labels=c('below 40%','above 40%')))
# plotting factor variable: GENERATES ERROR
ggplot(CS_mun_shp2)+
geom_sf(aes(geometry=geometry,
fill=cs_above40),
color=NA)
Единственная разница между моим кодом и воспроизводимым примером выше заключается в том, что мне нужно указать geometry
внутри aes()
, иначе я получаю еще одну ошибку.