在现有的geom_sf层下面插入geom_sf层

4

我有一个基本的印度地图,带有各个州和边界、一些标签以及许多其他规格存储为gg对象。我想生成许多带有区级别图层的地图,它将承载来自不同变量的数据。

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

我认为我可以通过调用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

预期结果

非常感谢您提供的任何帮助!


我觉得我漏掉了什么。既然你有三个单独的“sf”对象,为什么不直接绘制地区+州+国家呢? - camille
可能是我自己的无知。我有很多修改州和国家外观的代码,这些代码不会改变,必须重复使用。这在上面的reprex中由basicIndia表示。如果我执行ggplot(districts) + basicIndia,它会抛出一个错误,因为我正在绘制一个gg对象,而不是一个df。我不知道如何存储ggplot的部分以重新组合它们。 - Fons MA
2个回答

7

我还不确定你需要什么细节,但是ggplot2会按照您提供的顺序绘制图层。因此,类似于以下代码:

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

将绘制列,然后在其上绘制点,最后在前面的图层上绘制线条。
对于sf图,同样适用,这使得轻松制作多个地理级别的图表变得容易。
(我在sf对象上使用rmapshaper::ms_simplify来简化它们并加速绘图。)
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)

但是你不能将它们添加,因为你会有两个基础的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包(版本v0.2.1)于2018年10月29日创建的。


3

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

谢谢,那解决了第一阶段的问题...不过我还得问第二个问题...xD - Fons MA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接