объединение цветов палитры colorRampPalette и построение графиков с помощью ggplot - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь повторить, используя ggplot2, более ранний вопрос, который у меня возник, был leaflet . Я пытаюсь объединить две палитры, где одна используется, если моя переменная ниже определенного порога, и другая, если выше определенного порога. Как и в случае с моим leaflet вопросом, мой окончательный сюжет кажется неправильным. Я также хочу преобразовать факторную легенду в непрерывную. Пример кода:

library(sf)  
library(leaflet)
library(RColorBrewer)

# preparing the shapefile
nc <- st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) %>%
  st_transform(st_crs(4326)) %>%
  st_cast('POLYGON')

# Create 108 categories

mutate(nc, category = ntile(PERIMETER, n = 108)) -> nc

x <- sum(nc$PERIMETER < 1.3)  
x # number of values below threshold = 21


### Create an asymmetric color range
## Make vector of colors for values smaller than 1.3 (21 colors)
rc1 <- colorRampPalette(colors = c("#006837", "#1A9850"), space = "Lab")(x)    #21

## Make vector of colors for values larger than 1.3
rc2 <- colorRampPalette(colors = c("#FDAE61", "#A50026"), space = "Lab")(length(nc$PERIMETER) - x)

## Combine the two color palettes
rampcols <- c(rc1, rc2)

mypal <- colorFactor(palette = rampcols, domain = nc$category)
previewColors(colorNumeric(palette = rampcols, domain = NULL), values = 1:length(nc$PERIMETER))


nc %>%
  ggplot() +
  geom_sf(aes(fill = factor(category))) +
  scale_fill_manual(values = mypal(nc$category), guide = FALSE) 

дает этот график:

enter image description here

но листовка (правильная окраска)

leaflet() %>%
  addTiles() %>%
  addPolygons(data = nc,
              fillOpacity = 0.7,
              fillColor = ~mypal(nc$category),
              popup = paste("PERIMETER: ", nc$PERIMETER)) %>%
  addLegend( pal = mypal, values = nc$category)

дает правильный график:

enter image description here

Вы видите, что цифра ggplot не та, которую я не могу исправить.

Кроме того, когда я добавляю легенду к ggplot, я получаю легенду фактора для новой палитры, но я хочу непрерывную (даже если переменная является фактором):

nc %>%
  ggplot() +
  geom_sf(aes(fill = factor(category))) +
  scale_fill_manual(values = mypal(nc$category))

enter image description here

Кто-нибудь знает, как решить проблему окраски и изменить связанную легенду в непрерывной форме? Спасибо

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Я думаю, что это вызвано использованием factor() с использованием следующего кода:

nc %>%
  ggplot() +
  geom_sf(aes(fill = factor(category))) +
  scale_fill_manual(values = mypal(levels(factor(nc$category))), guide = FALSE) 

дает вам карту с той же раскраской, что и листовка.

result

0 голосов
/ 23 февраля 2020

Для любого, кто придет к этому, самый близкий ответ, который я смог найти, это использовать пакет scales после этого вопроса вместо scale_fill_manual. Используя этот подход, я больше не использую mypal, но ввожу цвета вручную в точке обрезки, используя хитрость: 1.299 вместо 1.3 (rescale(c(.999, 1.2999, 1.3, 3.640)) вместо rescale(c(.999, 1.2999, 1.3, 3.640)))

library("scales")
range(nc$PERIMETER)
#[1] 0.999 3.640
nc %>%
  ggplot() +
  geom_sf(aes(fill = PERIMETER)) +
  scale_fill_gradientn(colours = c("#006837", "#1A9850", "#FDAE61", "#A50026"), 
                       values = rescale(c(.999, 1.2999, 1.3, 3.640))
                       #guide = "colorbar"
                       #limits=c(-.1,.3)
  )

подача:

enter image description here

...