在现有的geom_sf图层下方插入geom_sf图层

时间:2018-10-28 23:11:42

标签: r ggplot2 sf

我有一张基本的印度地图,上面有州和边界,一些标签以及许多其他规格,均存储为gg对象。我想生成许多带有区域图层的地图,这些地图将包含来自不同变量的数据。

为防止区域地图覆盖州和国家/地区的边界,它必须位于所有先前代码之前,我希望避免重复。

我认为我可以通过按照this answer调用gg对象的$layers来做到这一点。但是,它将引发错误。 Reprex如下:

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 :(得分:2)

如果查看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)

答案 1 :(得分:2)

我仍然不确定是否缺少您要查找的详细信息,但是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中的任何一个进行其他计算,则可以提前或在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")

reprex package(v0.2.1)于2018-10-29创建