如何生成填充了特定区域的国家地图

How to generate a country map with specific regions filled in

我正在尝试创建一个填充了特定区域的国家/地区地图。我想将国家/地区分为 3 类:极端、高、太高。所以在每个类别中都会有一些地区(DEPARTAMEN)。每个类别都应该有特定的颜色(黑色、红色、橙色)。例如,在极端类别中,将有 8 个区域(DEPARTAMEN)具有相同的颜色(黑色)。

第一个答案正是我想要的,但我不能这样做,因为在这种情况下我不能使用 rworldmap 包:How to create a world map in R with specific countries filled in?。在第一个答案中,他们使用 rworldmap 函数来连接地图,并按类别填充区域。

这是我的数据的样子(shp 文件):

Simple feature collection with 6 features and 4 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -79.45845 ymin: -17.28501 xmax: -70.80408 ymax: -2.986125
geographic CRS: WGS 84
  IDDPTO DEPARTAMEN     CAPITAL FUENTE                       geometry
1     01   AMAZONAS CHACHAPOYAS   INEI MULTIPOLYGON (((-77.81211 -...
2     02     ANCASH      HUARAZ   INEI MULTIPOLYGON (((-77.64692 -...
3     03   APURIMAC     ABANCAY   INEI MULTIPOLYGON (((-73.74632 -...
4     04   AREQUIPA    AREQUIPA   INEI MULTIPOLYGON (((-71.98109 -...
5     05   AYACUCHO    AYACUCHO   INEI MULTIPOLYGON (((-74.34843 -...
6     06  CAJAMARCA   CAJAMARCA   INEI MULTIPOLYGON (((-78.70034 -...

有没有办法做到与这个问题 (How to create a world map in R with specific countries filled in?) 中选择的答案相同但不使用 rworldmap 包?我也在使用 ggplot 包来绘制地图。

这是我想要的输出:

您可以将数据框(即 left_join())与您需要的类别合并到您的 sf 对象中。 由于我没有你的 shapefile,我在 raster::getData().

的帮助下得到了一个类似的文件

我手动创建了一个名为“example_data”的数据框,根据您的要求,Lima、Ancash 和 Amazonas 具有“极端”值,并随机分配“非常高”或“高”给其余部门。

library(tidyverse)
library(sf)
library(raster)

sf_peru <- raster::getData("GADM", country ="PE", level =1) %>% sf::st_as_sf()

example_data <- tibble(
  departamentos = sf_peru$NAME_1,
  risk = sample(x = c('very high', 'high'), 
                   size = length(sf_peru$NAME_1), 
                   replace = TRUE )) %>% 
  mutate(risk = if_else(departamentos %in% c("Lima", "Amazonas", "Ancash"), true = "extreme", false = risk))

sf_peru_joined <-  sf_peru %>% left_join(example_data, by = c("NAME_1" = "departamentos"))
custom_colour_scale <- c("extreme" = "red", "very high" = "orange", "high" = "yellow")

ggplot() + 
  geom_sf(data = sf_peru_joined,
          aes(fill = risk)) +
  scale_fill_manual(values = custom_colour_scale,
                    limits = c("extreme", "very high", "high"))