在 R 中是不是可以在 ggplot + geom_sf 图表中包含组定义的圆圈?

Posted

技术标签:

【中文标题】在 R 中是不是可以在 ggplot + geom_sf 图表中包含组定义的圆圈?【英文标题】:Is it possible in R to include group-defined circles in a ggplot + geom_sf chart?在 R 中是否可以在 ggplot + geom_sf 图表中包含组定义的圆圈? 【发布时间】:2021-02-09 01:14:19 【问题描述】:

我正在制作一个显示城市的 ggplot + geom_sf 地图,此外,我想说明这些城市属于特定区域。 简而言之,我想绘制将城市组合到一个区域(例如“西部”)的圆圈(类似于 geom_encircle())。 enter image description here enter image description here

不幸的是,geom_encircle() 并没有得到想要的结果。 您对我该如何继续有任何想法/提示?

底层地图数据是一个sf对象(几何类型:Multipolygon,维度XY), 城市数据是一个 sf 对象(几何类型:点,维度 XY),包括一个名为“区域”的列,用于定义哪些城市应作为一个组被包围。

地图数据(德国)提取自 https://opendata.arcgis.com/datasets/2842f834961b4702a179bdcb08f7b6c9_0.zip?outSR=%7B%22latestWkid%22%3A3857%2C%22wkid%22%3A102100%7D 可以下载来自 ESRI Deutschland 的 shapefile “Bundesländer 2018 mit Einwohnerzahl”。 使用以下代码进行了转换: Deutschland <- st_read("xn--Bundeslnder_2018_mit_Einwohnerzahl-h4c", "LAN_ew_18")

城市数据来自谷歌地图(经度和纬度),由“地区”条目扩展(抱歉,我无法上传 csv 文件,因此请参阅 csv 屏幕截图)。 enter image description here R中的处理如下:

Cities <- read.csv("Cities_regions.csv")
Cities_sf <- st_as_sf(Cities, coords = c("Long", "Lat"), crs = 4326)
Cities_crs <- st_transform(Cities_sf, crs = crs(Deutschland, asText=TRUE))

绘制地图和城市数据是这样进行的:

ggplot(Deutschland) + 
geom_sf(fill="#D9D9D9", col="#A6A6A6", lwd=0.1) + 
geom_sf(data = Cities_crs, size = 1, col = "black") + 
coord_sf()

现在我陷入了困境,因为 geom_encircle 需要 X 和 Y 美学,到目前为止我无法正确指定。 你有提示吗?

最好的问候, 克里斯托夫

【问题讨论】:

【参考方案1】:

我不能 100% 确定预期的输出是什么,但也许以下方法可行:

# packages
library(sf)
#> Linking to GEOS 3.8.0, GDAL 3.0.4, PROJ 6.3.1
library(ggplot2)
library(ggalt)

# geodata
deutschland <- st_read("C:/Users/Utente/Downloads/xn--Bundeslnder_2018_mit_Einwohnerzahl-h4c/LAN_ew_18.shp") %>% 
  st_transform(crs = 4326)

# city data
cities <- data.frame(
  standort = c("koln", "bielefeld", "dusseldorf", "karlsruhe", "frankfurt", "munchen", "hannover"), 
  lat = c(50.9578353, 52.0149397, 51.2385861, 49.0159405, 50.1213479, 48.155004, 52.3797505), 
  lon = c(6.8272405, 8.3805278, 6.6742684, 8.3394944, 8.4964819, 11.4717963, 9.6914321), 
  region = c("W", "W", "W", "S", "S", "S", "N"), 
  stringsAsFactors = FALSE
)

# plot
ggplot(cities, aes(x = lon, y = lat)) + 
  geom_sf(data = deutschland, fill="#D9D9D9", col="#A6A6A6", lwd = 0.1, inherit.aes = FALSE) + 
  geom_point(size = 1, col = "black") + 
  geom_encircle(data = cities, aes(group = region, col = region))

由reprex package (v0.3.0) 于 2020 年 10 月 27 日创建

【讨论】:

谢谢你,阿吉拉!这正是我一直在寻找的。将点数据作为 ggplot 的基础是保持基本几何形状(如 geom_encircle)可能性的重要一步。谢谢你。最好的问候,克里斯托夫

以上是关于在 R 中是不是可以在 ggplot + geom_sf 图表中包含组定义的圆圈?的主要内容,如果未能解决你的问题,请参考以下文章

在 ggplot - R 中使用 geom_area 时创建平滑线

在ggplot(R)上包装geom_text / geom_label [重复]

是否可以用ggplot2在R中以科学计数形式显示绘图geom_text数据标签?

[R ggplot geom_text打掉背景 - 错误?

如何在 R 中的 ggplot2 中更改 geom_text 中的字体颜色?

在 R 中使用带有 ggplot 的 geom_line 时的锯齿形