当前位置: 首页 > 知识库问答 >
问题:

在现有geom_sf层下面插入geom_sf层

袁运良
2023-03-14

我有一张印度的基本地图,其中有邦和边界,一些标签,以及一些其他规范,作为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

任何帮助都将不胜感激!

共有2个答案

萧亦
2023-03-14

如果您查看geom_sf(data=disstsf),您会发现它是一个由两个元素组成的列表-您想要包含图层信息的第一个元素,因此geom_sf(data=disstsf,填充="金")[[1]]应该可以工作。

districts <- ggplot() +
  geom_sf(data = distSF, fill = "gold")

basicIndia$layers <- c(geom_sf(data = distSF, fill = "gold")[[1]], basicIndia$layers)
罗允晨
2023-03-14

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

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

将绘制列,然后在这些列上点,然后在前面的层上线条。

这同样适用于< code>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_sfs中进行。

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)

但是您不能添加它们,因为您将有两个基本的< code>ggplot对象。这应该就是你说的错误:

state_plot + 
  country_plot
#> Error: Don't know how to add country_plot to a plot

相反,如果您需要绘制绘图,则在其上添加其他内容,制作基本gg的,然后添加几何图层,例如带有不同数据集的geom_sf

state_plot +
  geom_sf(data = countryborder, fill = NA, color = "blue")

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

 类似资料:
  • 有办法用< code>geom_sf改变< code>alpha吗?这个例子来自< code >中的例子?geom_sf。我尝试添加< code>alpha=.2,但它似乎忽略了这种美感,尽管< code>alpha是< code>geom_line的公认美感。它不会忽略< code>fill的alpha值,在本例中是< code>NA。

  • 我正在 ggplot 中处理多个 sf 几何形状,并希望以点、线和正方形(用于多边形)的形式显示图例。但是,geom_sf图例结合了如下所示的几何特征(即组合线和点): 我想要三个单独的图例,一个黄色的正方形,一个粉色的点,和一条紫色的线。这只是我绘制单个几何图形时的情况,而不是三个几何图形的组合。 我查找了类似的主题,但没有一个涉及点几何,即 https://github.com/tidyver

  • 数据源是具有PostGIS几何类型的PostgreSQL数据库。我可以使用包直接从SQL查询我想要的数据到data.frame。 由于 R 抱怨原始几何类型,因此我在 SQL 查询中对几何使用 以便将它们作为类型存储在 中。我有三种类型:、和。请注意,我的数据是几何(例如,笛卡尔x,y,z坐标),而不是地图投影的地理。 制作MWE有点困难,因为我必须用换行符分隔每个LINESTRING和POLYG

  • 我正在尝试使用 中的 和 制作地图,其中一组点数据使用连续比例(-1 到 1)着色,一组线数据使用离散比例(a,b,c,d)着色。但是,当我在同一张地图中同时使用离散和连续美学时,我遇到了麻烦。这里发布了一个类似的问题,但它没有涉及映射美学。 下面是一个简化的示例: 很明显,连续(点数据)和离散(线数据)美学之间存在冲突,但我如何每次调用为每个数据集使用不同的颜色美学?使用<code>inheri

  • 我的问题结合了之前在Stackoverflow上发布的两个独立问题:I .为ggplot添加多个图例;ii .将线条图例添加到geom_sf。 我想在中添加多个图例(如第一篇文章中所述),但我使用了。这使得填充美学空间变得复杂。上面i.中建议的答案不适用于多种类型的几何图形——我们不能将点和线分配给单个类,然后使用因子。在我的例子中,我有几个线和点shapefile,只是想为添加的每个shapef

  • 使用绘制时,删除网格线的标准方法似乎是徒劳的。 例如,如果我们绘制一个简单的< code>ggplot对象,这将删除网格 回报 但是当您使用绘制时,相同的代码无法删除网格