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

Fon*_* MA 3 r ggplot2 r-sf

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

为了防止地区地图覆盖州和国家边界,它必须在所有以前的代码之前,我想避免重复。

我想我可以通过$layers根据这个答案调用gg 对象来做到这一点。但是,它会引发错误。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
Run Code Online (Sandbox Code Playgroud)

# 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
Run Code Online (Sandbox Code Playgroud)

预期结果

任何帮助将非常感激!

cam*_*lle 6

我仍然不确定我是否遗漏了您正在寻找的细节,但会ggplot2按照您提供的顺序绘制图层。所以像

ggplot(data) +
  geom_col() +
  geom_point(...) +
  geom_line(...)
Run Code Online (Sandbox Code Playgroud)

将绘制列,然后点在这些列的顶部,然后在前一层的顶部绘制线。

同去的sf地块,这使得它容易使这样的多个地理层面的情节。

(我rmapshaper::ms_simplifysf对象上使用只是为了简化它们并加快绘图速度。)

ggplot(data) +
  geom_col() +
  geom_point(...) +
  geom_line(...)
Run Code Online (Sandbox Code Playgroud)

然后,您可以按照需要显示的顺序添加图层来进行绘图。请记住,如果您需要对这些sfs 中的任何一个进行其他计算,您可以提前或在geom_sf.

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

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

关于尝试将一个图添加到另一个图:ggplot2在图层中工作,因此您创建一个基础ggplot对象,然后在其上添加几何图形。例如,您可以制作两个有效的图:

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)
Run Code Online (Sandbox Code Playgroud)

但是您不能添加它们,因为您将有 2 个基础ggplot对象。这应该是你提到的错误:

state_plot <- ggplot(stateSF) + 
  geom_sf(color = "white", fill = NA)
country_plot <- ggplot(countryborder) + 
  geom_sf(color = "blue", fill = NA)
Run Code Online (Sandbox Code Playgroud)

相反,如果您需要绘制绘图,请在其顶部添加其他内容,制作 base ggplot,然后添加几何图层,例如geom_sf具有不同数据集的 a 。

state_plot + 
  country_plot
#> Error: Don't know how to add country_plot to a plot
Run Code Online (Sandbox Code Playgroud)

reprex 包(v0.2.1)于 2018 年 10 月 29 日创建