Вставьте слой geom_sf под существующие слои geom_sf - PullRequest
0 голосов
/ 29 октября 2018

У меня есть базовая карта Индии с штатами и границами, некоторыми надписями и рядом других спецификаций, хранящихся в виде объекта gg. Я хотел бы сгенерировать несколько карт со слоем местности, который будет содержать данные из разных переменных.

Чтобы не допустить перезаписи на картах штата границ штата и страны, он должен быть перед всем предыдущим кодом, который я бы хотел избежать повторения.

Я думал, что смогу сделать это, вызвав $layers для объекта gg согласно этому ответу . Однако, это выдает ошибку. Представляем ниже:

library(ggplot2)
library(sf)
library(raster)

# Download district and state data (should be less than 10 Mb in total)

distSF <- st_as_sf(getData("GADM",country="IND",level=2))

stateSF <- st_as_sf(getData("GADM",country="IND",level=1))

# Add border

countryborder <- st_union(stateSF)

# Basic plot

basicIndia <- ggplot() +
  geom_sf(data = stateSF, color = "white", fill = NA) +
  geom_sf(data = countryborder, color = "blue", fill = NA) +
  theme_dark()

basicIndia

# Data-bearing plot

districts <- ggplot() +
  geom_sf(data = distSF, fill = "gold")

basicIndia$layers <- c(geom_sf(data = distSF, fill = "gold"), basicIndia$layers)

basicIndia
#> Error in y$layer_data(plot$data): attempt to apply non-function

Ожидаемый результат

Любая помощь будет высоко ценится!

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Я все еще не уверен, что мне не хватает детали того, что вы ищете, но ggplot2 рисует слои в том порядке, в котором вы их предоставляете. Так что-то вроде

ggplot(data) +
  geom_col() +
  geom_point(...) +
  geom_line(...)

нарисует столбцы, затем точки над ними, затем линии поверх предыдущих слоев.

То же самое относится к sf графикам, что позволяет легко создать график, подобный этому, из нескольких географических уровней.

(я использую rmapshaper::ms_simplify на sf объектах только для того, чтобы упростить их и ускорить процесс построения.)

library(dplyr)
library(ggplot2)
library(sf)
library(raster)

distSF <- st_as_sf(getData("GADM",country="IND",level=2)) %>% rmapshaper::ms_simplify()
...

Затем вы можете построить график, сложив слои в том порядке, в котором они вам нужны. Помните, что если вам нужно выполнить другие вычисления с любым из этих sf s, вы можете сделать это заранее или внутри вашего geom_sf.

ggplot() +
  geom_sf(data = distSF, fill = "gold", size = 0.1) +
  geom_sf(data = stateSF, color = "white", fill = NA) +
  geom_sf(data = countryborder, color = "blue", fill = NA)

Что касается попытки добавить один график к другому: ggplot2 работает в слоях, поэтому вы создаете один базовый объект ggplot, а затем добавляете геометрию поверх него. Таким образом, вы могли бы сделать, например, два действительных графика:

state_plot <- ggplot(stateSF) + 
  geom_sf(color = "white", fill = NA)
country_plot <- ggplot(countryborder) + 
  geom_sf(color = "blue", fill = NA)

Но вы не можете добавить их, потому что у вас будет 2 базовых ggplot объекта. Это должно быть ошибкой, которую вы упомянули:

state_plot + 
  country_plot
#> Error: Don't know how to add country_plot to a plot

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

state_plot +
  geom_sf(data = countryborder, fill = NA, color = "blue")

Создано в 2018-10-29 пакетом Представить (v0.2.1)

0 голосов
/ 29 октября 2018

Если вы посмотрите на geom_sf(data=distSF), вы увидите, что это список, состоящий из двух элементов - вам нужен первый, который содержит информацию о слое, поэтому geom_sf(data = distSF, fill = "gold")[[1]] должен работать.

districts <- ggplot() +
  geom_sf(data = distSF, fill = "gold")

basicIndia$layers <- c(geom_sf(data = distSF, fill = "gold")[[1]], basicIndia$layers)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...