Карты ggplot - нежелательные горизонтальные линии при использовании координат_карты - PullRequest
1 голос
/ 07 апреля 2020

У меня проблема с проецированием карты Европы, когда я использую coord_map в пакете ggplot. Код ниже дает мне странные и нежелательные горизонтальные линии в случайных местах. Кто-нибудь знает, как решить эту проблему?

Я не хочу использовать coord_quickmap или coord_cartesian, потому что я хочу сохранить прямые линии стран.

library(ggplot2)

map.world <- map_data("world")

ggplot(map.world, aes(x = long, y = lat)) + 
  geom_polygon(mapping = aes(x = long, y = lat, group = group), fill =  "#B3B1B5", color = "#D9D8DA",size = 0.4) +
  theme_minimal() +
  theme(axis.text = element_blank(), text = element_blank(), panel.grid = element_blank()) +
  coord_map(xlim = c(-27,36), ylim = c(34,67))

enter image description here

1 Ответ

2 голосов
/ 08 апреля 2020

Есть два способа обойти вашу проблему:

Простой способ

Этот способ требует небольшой настройки вашего кода (обратите внимание, что я использую 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

В случае, если вам нужно сделать различные масштабирования, вы можете легко обернуть любую альтернативу в функцию.

Надеюсь, это поможет

BONUS BALL: Возможно, вам будет интересно проверить tmap пакет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...