从 R 中的美国县级地图中删除五大湖

Removing the Great Lakes from US county-level maps in R

我正在使用 R 绘制美国县级地图。我从 GADM 下载了美国的 shapefile。县级shape文件为“gadm36_USA_2.shp”。然后我使用下面的代码绘制地图:

library(sf)
library(tidyverse)

us2 <- st_read("<Path>\gadm36_USA_2.shp")

mainland2 <- ggplot(data = us2) +
geom_sf(aes(fill = NAME_2), size = 0.4, color = "black") +
coord_sf(crs = st_crs(2163), 
         xlim = c(-2500000, 2500000), 
         ylim = c(-2300000, 730000)) + guides(fill = F)

五大湖区(用红色箭头表示)已绘制出来,而不是留空:

我要的是如下图,大湖区留空:

如何从“gadm36_USA_2.shp”中识别出哪些行对应于五大湖地区,以便我可以删除它们?

我知道除了 GADM 之外,还有其他方法可以获取 shapefile。我相信 GADM 是提供全球边界的极好资源。我想借此机会更好地了解从 GADM 下载的数据。

当然,欢迎使用其他方式获取美国县级边界数据。我注意到 USAboundaries 包还提供国家、州和县级边界,但我在安装相关的 USABoundariesData 包时遇到了困难。欢迎任何以 GADM 的 shapefile 以外的方式绘制美国县的想法。谢谢。

一种方法是删除现有记录中标记有 Lake 的每个特征(目前有 13 个特征)。首先,您需要在属性 table 中找到湖泊名称,如下所示:

# retrieving the name of lakes and excluding them from the sf 

all.names = us2$NAME_2
patterns = c("Lake", "lake")

lakes.name <- unique(grep(paste(patterns, collapse="|"), all.names, value=TRUE, ignore.case = TRUE))
#[1] "Lake and Peninsula" "Lake"               "Bear Lake"          "Lake Michigan"      "Lake Hurron"        "Lake St. Clair"    
#[7] "Lake Superior"      "Lake of the Woods"  "Red Lake"           "Lake Ontario"       "Lake Erie"          "Salt Lake"         
#[13] "Green Lake" 

`%notin%` <- Negate(`%in%`)
us <- us2[us2$NAME_2 %notin% lakes.name, ]

然后你可以映射剩余的特征:

mainland2 <- ggplot(data = us) +
  geom_sf(aes(fill = NAME_2), size = 0.4, color = "black") +
  coord_sf(crs = st_crs(2163), 
           xlim = c(-2500000, 2500000), 
           ylim = c(-2300000, 730000)) + guides(fill = F)
mainland2

另一种方法(更简单但不太灵活)是通过从 ENGTYPE_2 中排除 Water body 值来映射县特征,如下所示:

us <- us2[(us2$ENGTYPE_2) != "Water body",]
mainland2 <- ggplot(data = us) +
  geom_sf(aes(fill = NAME_2), size = 0.4, color = "black") +
  coord_sf(crs = st_crs(2163), 
           xlim = c(-2500000, 2500000), 
           ylim = c(-2300000, 730000)) + guides(fill = F)
mainland2