避免ggplot中的代码重复:添加各种geom_sf图

时间:2018-10-29 04:56:21

标签: r ggplot2 maps sp sf

下面是{{3}}关于箱线图的问题和{{3}}关于制作印度地图的问题,在处理地图的各个图层时,如何避免ggplot中的代码重复?

以下是reprex。我认为最简单的方法是: 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 :(得分:1)

解决该问题的另一种方法是使用ggplot_build()

使用以下方法制作ggplot_build对象:

indiaBuild <- ggplot_build(basicIndia)

我们现在可以使用:

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

提取图