Эквивалент eqscplot в ggplot2 для карт (geom_sf &ordin_sf) - PullRequest
0 голосов
/ 11 апреля 2020

Я ищу ggplot2 эквивалент для eqscplot (пакет MASS), который может заполнить все окно графика, сохраняя при этом масштаб на карте в ggplot.

Там coord_fixed , где декартовы координаты могут быть установлены с фиксированной крысой ios (аргумент aspect =), но это не работает, если я использую geom_sf(); geom_sf() требует coord_sf для построения графика и не может быть слоем ggplot, если coord_sf является слоем.

Есть ответ ( ggplot2: Отразить оси и сохранить соотношение сторон данных ), но это не автоматическое c, что является проблемой, когда нужно сделать много карт и когда идеальным рабочим процессом является автоматическое создание карт. Он также не увеличивает точки, как eqscplot.

eqscplot способен поддерживать соотношение сторон, когда значения range из x и y сильно различаются, что полезно для построения карт.

library(rnaturalearth)
library(rnaturalearthdata)
library(MASS)
library(ggplot2)

world <- ne_countries(scale = 'medium', returnclass = 'sf',
                      country = c('India', 'Sri Lanka', 'Pakistan', 'Myanmar', 
                                  'Malaysia', 'Indonesia', 'Thailand', 
                                  'Nepal', 'Bhutan', 'Laos', 'China', 'Iran',
                                  'Maldives'))

RNGkind('Mers')
set.seed(42)

lonlat <- data.frame(lon = rnorm(10, 80, 5),
                     lat = rnorm(10, 12, 5))
apply(lonlat, 2, range)
          lon       lat
[1,] 77.17651  9.343545
[2,] 90.09212 14.286645

eqscplot(lonlat$lon, lonlat$lat, type = 'n')
plot(world, add = T, col = NA)
points(lonlat$lon, lonlat$lat, col = 'red', pch = 16)
#Compare the lon/lat ranges on the map with the ranges of the data's longitude and latitude

enter image description here

Я искал, есть ли способ сделать это ggplot2, но если Я не указываю пределы долготы и широты, она принимает размеры стран, которые я указала в объекте world.

ggplot(data = world) +
  geom_sf() +
  geom_point(data = lonlat, aes(x = lon, y = lat))

enter image description here

У меня есть несколько сотен карт, поэтому автоматизировать процесс с семейством функций apply или циклами for предпочтительнее. Но мне нужно что-то, что может автоматически увеличивать точки, которые я строю, сохраняя соотношение сторон. Я собираюсь сделать это в ggplot2, потому что мои соавторы не имеют такого опыта работы с R, и их научили использовать tidyverse, поэтому все, что я могу сделать, чтобы облегчить понимание кода, может go долгий путь.

Мой вопрос: Есть ли eqscplot эквивалент в ggplot2? Что-то, где соотношение сторон может быть установлено автоматически, увеличивает масштаб, где точки вместо экстента многоугольника world, и заполняет все окно графика, сохраняя масштабы?

1 Ответ

0 голосов
/ 14 апреля 2020

При использовании geom_sf похоже, что графики будут корректироваться для отображения экстента самого большого объекта. Вы можете использовать st_crop для настройки слишком больших данных. Это может помочь сделать все ваши объекты sf коллекциями, вместо того, чтобы использовать geom_sf и geom_point.

Ниже приведен краткий пример, который вы можете настроить, чтобы изменить ограничивающий прямоугольник карт. Хороший пост @ Jindra-Lacko, посвященный настройке ограничивающих рамок, можно найти здесь: https://www.jla-data.net/eng/adjusting-bounding-box-of-a-tmap-map/

Хотя большинство из них использует tmap, его следует применять и к ggplot2.

library(rnaturalearth)
library(rnaturalearthdata)
library(MASS)
library(ggplot2)
library(tidyverse)
library(sf)
#> Linking to GEOS 3.6.2, GDAL 2.2.3, PROJ 4.9.3

world <- ne_countries(scale = 'medium', returnclass = 'sf',
                      country = c('India', 'Sri Lanka', 'Pakistan', 'Myanmar', 
                                  'Malaysia', 'Indonesia', 'Thailand', 
                                  'Nepal', 'Bhutan', 'Laos', 'China', 'Iran',
                                  'Maldives'))

RNGkind('Mers')
set.seed(42)

lonlat <- data.frame(lon = rnorm(10, 80, 5),
                     lat = rnorm(10, 12, 5))
#apply(lonlat, 2, range)
# lon       lat
# [1,] 77.17651  9.343545
# [2,] 90.09212 14.286645

# eqscplot(lonlat$lon, lonlat$lat, type = 'n')
# plot(world, add = T, col = NA)
#points(lonlat$lon, lonlat$lat, col = 'red', pch = 16)
#Compare the lon/lat ranges on the map with the ranges of the data's longitude and latitude

#make lonlat an sf object
lonlat_sf <- st_as_sf(lonlat, 
                      coords = c('lon', 'lat')) %>%
  st_set_crs(st_crs(world))

ggplot() +
  geom_sf(data = lonlat_sf, color = 'red') +
  geom_sf(data = world %>% st_crop(lonlat_sf, world ), fill = NA) +
  coord_sf()
#> although coordinates are longitude/latitude, st_intersection assumes that they are planar
#> Warning: attribute variables are assumed to be spatially constant throughout all
#> geometries

Создано в 2020-04-14 с помощью представительного пакета (v0.3.0)

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