【问题标题】:How can I change the color of a shared border using sf?如何使用 sf 更改共享边框的颜色?
【发布时间】:2022-01-17 19:17:52
【问题描述】:

我想将共享颜色的颜色更改为不同的颜色,比如说红色。到目前为止,我正在策划德国联邦州巴伐利亚州和奥地利各州。我从https://gadm.org/download_country.html 获取数据-

德国 2 级 - https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_DEU_2_sf.rds

德国 1 级 - https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_DEU_1_sf.rds

奥地利 2 级 - https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_AUT_2_sf.rds

奥地利 1 级 - https://biogeo.ucdavis.edu/data/gadm3.6/Rsf/gadm36_AUT_1_sf.rds

library("sf")
library("raster")
library("dplyr")
library("spData")
library("spDataLarge")
library("ggplot2")
library("patchwork")
library(tmap)    # for static and interactive maps
library(ggpattern)

data_aut <- readRDS("~/plot_at_ger/data/gadm36_AUT_2_sf.rds")
data_ger <- readRDS("~/plot_at_ger/data/gadm36_DEU_2_sf.rds")
data_aut_high <- readRDS("~/plot_at_ger/data/gadm36_AUT_1_sf.rds")
data_aut_high <- data_aut_high[which(data_aut_high$NAME_1=='Salzburg' | data_aut_high$NAME_1=='Oberösterreich' | data_aut_high$NAME_1=='Tirol' | data_aut_high$NAME_1=='Vorarlberg'), ]
data_ger_high <- readRDS("~/plot_at_ger/data/gadm36_DEU_1_sf.rds")
data_ger_high <- data_ger_high[which(data_ger_high$NAME_1=='Bayern'), ]

ggplot() +
  geom_sf(data = ger_selected_data_bavaria, fill = NA) +
  geom_sf(data = aut_selected_data_rel, fill = NA) +
  geom_sf(data = data_aut_high, fill = NA, size = 1, color = "grey35") +
  geom_sf(data = data_ger_high, fill = NA, size = 1, color = "black") 

这会产生下图:

有没有办法改变共享边框的颜色?

谢谢!

【问题讨论】:

  • 凯文,欢迎来到 SO。这似乎是一个有趣的问题,您是否愿意尝试使其可重现(为了我们帮助您和后代,以帮助他们理解问题及其解决方案)
  • 感谢您的评论!我添加了更多信息,希望对您有所帮助!
  • @tjebo 我查看了链接的 cmets 并尝试使用 dput,但 shapefile 包含大量信息。一般来说,在这种情况下链接原始数据库是否更好?我知道大多数人不会下载文件并且在我的问题中提供数据会更好,但我不确定在这种情况下最好的解决方案是什么。
  • 你试过了!检查@JindraLacko 的答案以获取使问题可重现的替代方法。 (有时需要采取不同的方法来做到这一点)

标签: r ggplot2 sf


【解决方案1】:

{sf} > 1.0 的上下文中绘制共享边框有点棘手,因为它使用 s2 依赖项进行球面操作,并且 s2 库引入了半封闭多边形的新概念(在GEOS 年)。

更多信息请参见https://r-spatial.github.io/s2/reference/s2_options.html#model

无论如何,请考虑这段代码,它建立在 {giscoR} 包上以访问 EU NUTS 区域,并在 sf::st_intersection() 上找到共享边界。请注意model = "closed" 的使用(即所有多边形都包含它们的整个边界),这可能不是很明显,但对于代码按预期工作是必要的。

library(dplyr)
library(ggplot2)
library(giscoR)
library(sf)

bavaria <- gisco_get_nuts(country = "DE",
                          nuts_level = "1") %>% 
  filter(NUTS_NAME == "BAYERN")

austria <- gisco_get_nuts(country = "AT",
                          nuts_level = "2")

shared_border <- st_intersection(bavaria,
                                 austria,
                                 model = "closed") # this line is important!

ggplot() +
  geom_sf(data = bavaria, fill = NA, color = "gray40") +
  geom_sf(data = austria, fill = NA, color = "gray40") +
  geom_sf(data = shared_border, fill = NA, color = "red")

【讨论】:

  • 太棒了!这样可行!我尝试了交集解决方案,但我没有包括关键的model = "closed" 选项!谢谢!
  • 我知道! :) s2 版本仍尘埃落定,虽然它有一些不错且受欢迎的结果,但它确实有它的......惊喜:)
  • 你可以设置sf::sf_use_s2(FALSE)来关闭s2并避免一些过渡问题
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 2020-01-12
  • 2013-02-18
  • 1970-01-01
  • 2017-12-02
  • 2020-07-01
  • 2021-09-27
  • 2019-11-23
相关资源
最近更新 更多