【问题标题】:How to generate a country map with specific regions filled in如何生成填写特定区域的国家地图
【发布时间】:2021-06-05 07:55:39
【问题描述】:

我正在尝试创建一个填写特定区域的国家地图。我想将国家划分为 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 包来绘制地图。

这是我想要的输出:

【问题讨论】:

  • 这似乎是我在 StackOverflow 和 WWW 上看到的答案的问题。它似乎也没有可重现的例子。您应该先进行搜索,如果没有找到答案,请进行调查,然后搜索如何使用minimal reproducible example 提出问题。
  • 是的,有可能。您可能需要在某个地方与秘鲁的部门一起获取 shapefile。然后加入一个包含阈值的数据集。包 tidyverse() 和 sf() 将轻松处理任务。

标签: r ggplot2 maps shapefile sf


【解决方案1】:

您可以将数据框(即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"))

【讨论】:

  • 谢谢,真的很有帮助。但是我不清楚如何对部门进行分组。例如,我希望 Lima、Amazonas、Ancash 属于极端类别并用红色填充。代码可以放在哪里?
  • 您可以创建一个包含这些值的数据框。用“true_data”df替换我的数据框“random_data”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多