Показывать полигоны внутри полигонов на многослойной карте шейп-файлов в ggplot2

Я хочу использовать несколько слоев шейп-файлов, которые располагаются друг над другом. У меня есть три уровня глубины батиметрических карт (т.е. 200 м, 1000 м и 2000 м). В полигонах есть некоторые "дыры" (* не белый полигон), как вы можете видеть на карте ниже, которую я сгенерировал в QGIS (то есть в пределах 200 м есть полигоны глубиной 2000 м):

Батиметрическая карта, созданная QGIS

И это то, что я сделал в ggplot2, используя те же шейп-файлы: Батиметрическая карта, созданная ggplot2

Полигоны внутри полигонов не отображаются на карте ggplot. Как я могу обойти эту проблему?

Заранее спасибо.

R-скрипты, используемые для карты:

Thailand <- readShapePoly("Thailand.shp")
Thailand2 <- fortify(Thailand)
Bthy_200m <- readShapePoly("ne_10m_bathymetry_K_200.shp")
Bthy_1000m <- readShapePoly("ne_10m_bathymetry_all/ne_10m_bathymetry_J_1000.shp")
Bthy_2000m <- readShapePoly("ne_10m_bathymetry_all/ne_10m_bathymetry_I_2000.shp")

Bthy_200m_crop <- crop(Bthy_200m, extent(84.11236, 108.4594, -4.046979, 24.09534))
Bthy_1000m_crop <- crop(Bthy_1000m, extent(84.11236, 108.4594, -4.046979, 24.09534))
Bthy_2000m_crop <- crop(Bthy_2000m, extent(84.11236, 108.4594, -4.046979, 24.09534))

Bthy_200m_crop2<- fortify(Bthy_200m_crop)
Bthy_1000m_crop2<- fortify(Bthy_1000m_crop)
Bthy_2000m_crop2<- fortify(Bthy_2000m_crop)

ggplot()+geom_polygon(data = Bthy_200m_crop2, aes(long, lat, group = group), fill="#52958b", na.rm =TRUE)+geom_polygon(data = Bthy_1000m_crop2, aes(long, lat, group = group), fill="#128277", na.rm =TRUE)+geom_polygon(data = Bthy_2000m_crop2, aes(long, lat, group = group), fill="#004D47", na.rm =TRUE)+geom_polygon(data = est_contour, aes(long, lat, group = group), fill="#99CCCC")+  geom_path(data = est_contour, aes(long, lat, group = group), color = "black")+theme_bw()+theme(panel.background = element_rect(fill = "#5EA8A7"))+ theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())

Шейп-файлы находятся здесь: http://www.naturalearthdata.com/downloads/10m-physical-vectors/10m-bathymetry/

1 ответ

Решение

Поэтому я скачал некоторые из упомянутых файлов. Чтобы увидеть полигоны внутри полигонов, я бы предложил использовать geom_sf. Вот некоторый код, а также изображение вывода, чтобы убедиться, что это то, что вам нужно. Вот код, чтобы сгенерировать это с помощью geom_sf. Обратите внимание, что я не использовал Таиланд, так как не смог найти шейп-файл и не использовал шейп-файл эстуария, но вы сможете применить этот код к графику.

library(sf)
library(tidyverse)
library(maptools)
library(rgdal)
library(raster)

Bthy_200m <- read_sf("ne_10m_bathymetry_K_200.shp")
Bthy_1000m <- read_sf("ne_10m_bathymetry_J_1000.shp")
Bthy_2000m <- read_sf("ne_10m_bathymetry_I_2000.shp")


Bthy_200m_crop <- st_intersection(Bthy_200m,st_set_crs(st_as_sf(as(extent(84.11236, 108.4594, -4.046979, 24.09534),"SpatialPolygons")), st_crs(Bthy_200m)))
Bthy_1000m_crop <- st_intersection(Bthy_1000m, st_set_crs(st_as_sf(as(extent(84.11236, 108.4594, -4.046979, 24.09534),"SpatialPolygons")), st_crs(Bthy_1000m)))
Bthy_2000m_crop <- st_intersection(Bthy_2000m, st_set_crs(st_as_sf(as(extent(84.11236, 108.4594, -4.046979, 24.09534),"SpatialPolygons")), st_crs(Bthy_2000m)))


Bthy_200m_crop2<- fortify(Bthy_200m_crop)
Bthy_1000m_crop2<- fortify(Bthy_1000m_crop)
Bthy_2000m_crop2<- fortify(Bthy_2000m_crop)
ggplot()+
  geom_sf(data = Bthy_200m_crop2,fill = "#52958b",na.rm = TRUE)+
  geom_sf(data = Bthy_1000m_crop2, fill = "#128277",na.rm = TRUE)+
  geom_sf(data = Bthy_2000m_crop2, fill="#004D47", na.rm =TRUE)+
  coord_sf(crs = st_crs(Bthy_1000m_crop2), datum = NA)+
  theme_bw()+
  theme(panel.background = element_rect(fill = "#5EA8A7"))+ 
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank())

введите описание изображения здесь

Другие вопросы по тегам