Я пытаюсь дать комбинированную цветовую схему в пространственном графике, используя ggplot2 следующим образом:
Я не нашел более простого способа сделать это, чем сложить два графика, верхний из которых имеет серый градиент для имитации насыщения:
ggplot(data = italian.regions) +
geom_sf(fill = c("#BFD6FF", "#FFEBBF")[as.numeric(as.factor(regions.lookup$`engine.top`))], lwd = .2) +
geom_sf(aes(fill = regions.lookup$`engine.diff`), lwd = .2, alpha = .3) +
scale_fill_gradient(high = "#666666", low = "#EFEFEF")
Я использую эстетику, чтобы заполнить градиент, и это работает. Это пример сюжета:
Но (конечно) цветовая легенда относится к эстетике, но было бы гораздо более осмысленно иметь легенду, описывающую дискретные значения в 'engine.top'.
Возможно ли это сделать? есть ли более простой способ получить двухцветную градиентную цветовую схему без наложения двух графиков?
tnx, я попытаюсь сделать воспроизводимый пример, хотя это звучит очень сложно из-за очень широких зависимостей, которые имеют мои карты
Вы можете просто собрать несколько упрощенных форм и индикаторов, которыми вы их раскрашиваете.
Я предпочитаю использовать scale_fill_identity()
и hcl()
. Посмотрите, работает ли это для вас
library(sf)
library(tidyverse)
# this file is already on your computer
nc <- st_read(system.file("shape/nc.shp", package = "sf"))
nc_colors <-
nc %>%
mutate(
# 220 = blue and # 40 = orange
hue = ifelse(str_detect(CNTY_ID, "^18"), 220, 40),
light = AREA/max(AREA)*100,
# the hcl function returns a hex code
hex = hcl(h = hue, l = light)
)
ggplot() +
geom_sf(data = nc_colors, aes(fill = hex)) +
scale_fill_identity()
Другое решение, которое вы можете использовать, это сделать что-то вроде aes(...fill = hue, alpha = AREA)
, а затем использовать scale_fill_manual()
Сразу хочу выкинуть, что это красивое решение. Я так редко вижу такие хорошие манипуляции с цветом, и еще реже думаю сделать это сам.
Это работает как шарм, очень элегантно и эффективно! Большое спасибо!
Несколько связанных шкал, подобных этой, были много обсуждали с некоторыми обходными путями (вот куча). Два недавних пакета, multiscales и ggnewscale, пытаются реализовать нечто подобное. Кроме того, проще помочь более конкретно или посмотреть, как это уже было решено, если вы включите воспроизводимый пример