Предотвращение повторения кода в ggplot: добавление различных графиков geom_sf - PullRequest
0 голосов
/ 29 октября 2018

Исходя из этого вопроса о коробочных диаграммах и моего собственного вопроса о создании карты Индии, что является хорошим способом избежать повторения кода в ggplot при работе с различными слоями карта

Ниже представлен представитель. Я думал, что самый простой способ будет: 1. сохранить базовую карту с государственными и национальными границами 2. добавить слой местности (отображение переменных).

Представьте себе повторение шага 2 для десятков переменных.

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 country border

countryborder <- st_union(stateSF)

# STEP 1: Basic plot

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

# STEP 2: Adding the data layer underneath so it doesn't cover the other borders

indiaMap$layers <- c(geom_sf(data = distSF, fill = "red")[[1]], indiaMap$layers[[2:3]])

indiaMap$layers <- c(geom_sf(data = distSF, fill = "gold")[[1]], indiaMap$layers[[2:3]])

indiaMap

Однако, таким образом, невозможно внести даже незначительные изменения в этот дополнительный слой, например, добавить другой заголовок. Следующее, очевидно, не работает, но делает мою точку зрения.

basicIndia$layers <- c(
  geom_sf(data = distSF, aes(fill = GINI), color = "white", size = 0.2)[[1]] +
    labs(title = "Gini coefficient"), 
                       basicIndia$layers)

Я неправильно подхожу к проблеме? Это то, что нельзя сделать?

1 Ответ

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

Другой способ решения этой проблемы - использовать ggplot_build().

Создайте объект ggplot_build, используя:

indiaBuild <- ggplot_build(basicIndia)

Вместо вашего шага 2 теперь мы можем использовать:

indiaBuild$plot$layers <- c(indiaBuild$plot$layers,
                            geom_sf(data=distSF, fill='gold')[[1]])

Вы можете изменить различные части объекта ggplot_build, включая заголовок:

indiaBuild$plot$labels$title <- 'Gini coefficient'

Когда закончите, вы можете извлечь только график, используя p <- indiaBuild$plot

...