在ggplot R中的geom_sf()不完整多边形中应用facet_wrap()时出错

Error applying facet_wrap() in geom_sf() incomplete polygon in ggplot R

我有一个包含 7 个区域的 shapefile。 我有一个 excel 文件,其中包含有关这 7 个地区的爬行动物的数据。 我将此 shapefile 与 excel.

合并

我尝试使用 ggplot 从 nome_popular 生成 facet_wrap(),但是在创建的每个面中都省略了其余的多边形部分。

我的暂定代码

形状文件:https://drive.google.com/file/d/1I1m9lBX69zjsdGBg2zfpii5H4VFYE1_0/view?usp=sharing

excel:https://docs.google.com/spreadsheets/d/1eKQWWCAalehTTrUuqUlMPQnSTEZxF--g/edit?usp=sharing&ouid=118442515534677263769&rtpof=true&sd=true

# load data.frame
serpentes <- read_excel("E:/22-serpentes_cg/R/serpentes_cg_finall.xlsx")

# filer data.frame
total_especies <- serpentes %>%
  rename(regiao_cg = REGIAO_CG) %>%
  group_by(
    especie, nome_popular,
    regiao_cg
  ) %>%
  summarise(Total_esp = sum(quant))

# load shapefile
regiao <- sf::st_read("E:/22-serpentes_cg/geo/regioes_urbanas.shp") %>%
  rename(regiao_cg = REGIAO_CG)

# join shapefile and excel
total_especies_shp <- dplyr::left_join(regiao, total_especies, by = "regiao_cg")

# map facet_warp
p_total_especies_shp <- ggplot(
  na.omit(total_especies_shp),
  aes(fill = factor(Total_esp))
) +
  geom_sf() +
  scale_fill_brewer(
    palette = "Spectral", na.value = "grey", direction = -1,
    "Total de\nSepertens Regatadas"
  ) +
  facet_wrap(~nome_popular)

p_total_especies_shp

输出不完整

OBS 编辑

我尝试了@stefan 的部分答案,但生成了一个名为“NA”的坏面。

新代码:

p_total_especies_shp <- ggplot(total_especies_shp)+
  geom_sf(data=regiao)+
  geom_sf(aes(fill=factor(Total_esp)))+
  scale_fill_brewer(
    palette = "Spectral", na.value = "grey", direction = -1,
    "Total de\nSepertens Regatadas")+
  
  facet_wrap(~nome_popular)

p_total_especies_shp

问题在于,通过分面,数据会分成几组,只有拆分数据中包含的多边形才会显示。

如果您希望在每个方面显示所有区域,那么一种选择是通过第二个 geom_sf 图层添加底图。在你的情况下 + geom_sf(regiao) + geom_sf() 应该可以完成这项工作。

作为示例,我使用 ?geom_sf:

中的默认示例
library(ggplot2)

set.seed(42)

nc <- sf::st_read(system.file("shape/nc.shp", package = "sf"), quiet = TRUE)
base <- nc
nc$facet <- sample(c("a", "b", "c", "d"), size = nrow(nc), replace = TRUE)

ggplot(nc) +
  geom_sf(data = base) +
  geom_sf(aes(fill = AREA)) +
  facet_wrap(~facet)

处理@stefan 的回答,如果你想去掉 NA 面板,你需要在第二个 geom 中提供带有 na.omit 的数据,让 ggplot 调用为空:

p_total_especies_shp <- ggplot() +
    geom_sf(data = regiao) +
    geom_sf(aes(fill = factor(Total_esp)), data = na.omit(total_especies_shp)) +
    scale_fill_brewer(
      palette = "Spectral", na.value = "grey", direction = -1,
      "Total de\nSepertens Regatadas"
    ) +
    facet_wrap(~nome_popular, drop = TRUE)
  
  p_total_especies_shp

这给出了你想要的结果: