Есть два способа обойти вашу проблему:
Простой способ
Этот способ требует небольшой настройки вашего кода (обратите внимание, что я использую magrittr вперед pipe ):
library(maps)
library(magrittr)
library(maptools)
library(broom)
library(ggplot2)
europe <- maps::map("world", fill=TRUE, plot=FALSE) %>%
maptools::pruneMap(xlim = c(-27,36), ylim = c(34,67))
ggplot(data= broom::tidy(europe)) +
geom_polygon(mapping = aes(x = long, y = lat, group = group),
fill = "#B3B1B5", color = "#D9D8DA",size = 0.4) +
theme_void() +
coord_map()
Подход "owin / экстент"
Другой способ обойти вашу проблему можно сделать, используя овин объектов. Этот вид объектов позволит вам создать пространственное окно. Тогда вы можете представить только пересечение такого окна на карте мира.
При таком подходе ваш код будет выглядеть следующим образом (также с использованием форварда magrittr и настройкой общего CRS )
library(maps)
library(magrittr)
library(spatstat)
library(maptools)
library(raster)
library(broom)
library(ggplot2)
#Defining a general EPSG so there won't be any superposition problems
epsg <- "+proj=longlat +datum=WGS84 +no_defs"
#Using the original maps package, then converting map into SpatialPolygons object
map.world <- maps::map("world", fill=TRUE) %$%
maptools::map2SpatialPolygons(., IDs=names,proj4string=CRS(epsg))
#In order to keep the names of the countries we create the following data.frame
country.labs <- sapply(slot(map.world, "polygons"), function(x) slot(x, "ID")) %>%
data.frame( ID=1:length(map.world), name=., row.names = .)
#We convert object map.world into a SpatialPolygonsDataFrame object
map.world.SPDF <- sp::SpatialPolygonsDataFrame(map.world, country.labs)
#Creating owin object using your zooming coordinates
#This step always requires to load packages 'spatstat' and 'maptools'
zoom <- as(spatstat::as.owin(c(-27,36,34,67)), "SpatialPolygons")
raster::projection(zoom)=epsg
#Storing intersection between 'zoom' and 'world.map'
europe <- raster::intersect(map.world.SPDF, zoom)
#*country names of object europe can be accessed via europe@data
#Representing object 'europe' using broom::tidy to create a data.frame object
ggplot() +
geom_polygon(data = broom::tidy(europe, region="name"),
mapping = aes(x = long, y = lat, group = group),
fill = "#B3B1B5", color = "#D9D8DA",size = 0.4) +
theme_void() +
coord_map()
#*country names after tidying 'europe' this way are in a new column called 'id'
В зависимости от того, что вы делаете, вы можете использовать
zoom <- as(raster::extent(c(-27,36,34,67)), "SpatialPolygons")
Для создания объекта экстент вместо объекта owin (Результат здесь будет быть таким же)
Результат, полученный любым методом, показан ниже
![enter image description here](https://i.stack.imgur.com/Y47WA.png)
В случае, если вам нужно сделать различные масштабирования, вы можете легко обернуть любую альтернативу в функцию.
Надеюсь, это поможет
BONUS BALL: Возможно, вам будет интересно проверить tmap пакет