在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
# 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
这给出了你想要的结果:
我有一个包含 7 个区域的 shapefile。 我有一个 excel 文件,其中包含有关这 7 个地区的爬行动物的数据。 我将此 shapefile 与 excel.
合并我尝试使用 ggplot 从 nome_popular
生成 facet_wrap(),但是在创建的每个面中都省略了其余的多边形部分。
我的暂定代码
形状文件:https://drive.google.com/file/d/1I1m9lBX69zjsdGBg2zfpii5H4VFYE1_0/view?usp=sharing
# 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
这给出了你想要的结果: