Легенда пользовательской категории ggplot для шейп-файла - PullRequest
0 голосов
/ 24 апреля 2020
  library(raster)
  library(ggplot2)
  library(sf)

  fr.shp.admin <- getData('GADM', country='FRA', level=0)
  fr.shp <- getData('GADM', country='FRA', level=1)
  fr.shp.df <- data.frame(fr.shp)

  set.seed(123)

  dat <- data.frame(
      NAME_1 = rep(fr.shp.df$NAME_1, 2), 
      season = rep(c('a','b'), each = 13),
      value = c(sample(0:6, size = 8, replace = T), 0.1, 0.6, 100, 500,1250,
                sample(0:6, size = 8, replace = T), 0.3, 0.7,50, 400,1700))

  fr.shp.sf <- st_as_sf(fr.shp)
  fr.shp.admin.sf <- st_as_sf(fr.shp.admin)

  temp.shp <- merge(fr.shp.sf, dat, by = 'NAME_1')

  ggplot() +
  geom_sf(data = temp.shp, aes(fill = value), colour = NA) +
  geom_sf(data = fr.shp.admin.sf, fill = NA, col = 'black') +
  facet_wrap(~season) 

enter image description here

Я хочу построить эту карту так, чтобы вместо непрерывной легенды у меня были категории, и я могу определить цвета для этих категорий. Например,

  (0-1] # => 0 & < 1
  (1-2] # >= 1 & < 2
  (2-3] # >= 2 & < 3
  (3-4] # >= 3 & < 4
  (4-5] # >= 4 & < 5
  > 5   # >= 5

Я хочу сделать это так, чтобы я мог по-разному раскрасить каждую категорию. Как я могу сделать это в ggplot

1 Ответ

0 голосов
/ 25 апреля 2020

Я предлагаю комбинацию base::cut(), чтобы превратить вашу непрерывную переменную в коэффициент, и ggplot2::scale_fill_manual(), чтобы дать категориям названные цвета.

Рассмотрим это небольшое изменение в вашем коде:

library(raster)
library(ggplot2)
library(sf)

fr.shp.admin <- getData('GADM', country='FRA', level=0)
fr.shp <- getData('GADM', country='FRA', level=1)
fr.shp.df <- data.frame(fr.shp)

set.seed(123)

dat <- data.frame(
  NAME_1 = rep(fr.shp.df$NAME_1, 2), 
  season = rep(c('a','b'), each = 13),
  value = c(sample(0:6, size = 8, replace = T), 0.1, 0.6, 100, 500, 1250,
            sample(0:6, size = 8, replace = T), 0.3, 0.7,50, 400, 1700))

fr.shp.sf <- st_as_sf(fr.shp)
fr.shp.admin.sf <- st_as_sf(fr.shp.admin)

temp.shp <- merge(fr.shp.sf, dat, by = 'NAME_1')

temp.shp$value2 = cut(temp.shp$value,
                      breaks = c(-Inf, 0, 1000, +Inf),
                      labels = c("low", "medium", "high"))

ggplot() +
  geom_sf(data = temp.shp, aes(fill = value2), colour = NA) +
  geom_sf(data = fr.shp.admin.sf, fill = NA, col = 'black') +
  scale_fill_manual(values = c("low" = "cornflowerblue",
                               "medium" = "goldenrod2",
                               "high" = "red")) + 
  facet_wrap(~season) 

enter image description here

...