用线条向地图添加标签

问题描述 投票:0回答:1

我想使用 geom_sf() 绘制地图并添加标签,如下面的手动地图(但我们不需要颜色或图例,这只是我们手头的地图)。

新地图:

地图数据可以在这里下载。该地图由三列组成:“Kommunenummer”(市政编号)、“Kommunenavn”(市政名称)、“几何”。上面地图中指出的两个地点是“沃尔达”(南部)和“特罗姆瑟”(北部)自治市。

我想我们需要确定这些城市的质心位置,然后使用 geom_text_repel() 之类的东西来指向它们,但我还没有让它工作得很好。有人有什么建议吗?

最小工作示例:

mapdata <- st_read("~/Downloads/Basisdata_0000_Norge_25833_NorskeFylkerKommunerIllustrasjonsdata2021_GeoJSON/kommuner2021.json")

ggplot(mapdata) +
  geom_sf() +
  theme_minimal() +
  theme(
    panel.grid.major = element_blank(),   # Removes major grid lines
    panel.grid.minor = element_blank(),   # Removes minor grid lines
    axis.text.x = element_blank(),        # Removes x-axis labels (Longitude)
    axis.text.y = element_blank(),        # Removes y-axis labels (Latitude)
    axis.title.x = element_blank(),       # Removes x-axis title
    axis.title.y = element_blank()        # Removes y-axis title
  )

r maps geom-sf
1个回答
0
投票

除非您使用数百个标签,否则

ggrepel
通常不是最有效的方法。您可能会花费过多的时间来正确绘制标签,而纠正问题可能会在其他地方产生问题。

我通常发现坚持使用

sf
包并手动创建几何图形更容易。可能需要进行一些尝试和错误才能获得正确的标签位置,但与使用 ggrepel 相比,只有几个标签,
几乎总是
更容易获得所需的结果。另外,我不确定
ggrepel
是否接受来自例如的函数
ggtext
允许使用不同大小字体的绘图标签。

此代表对两个标签使用 -/+0.5 十进制的统一偏移量。没有什么可以阻止您为每个标签设置不同的偏移量。由于我的挪威语有点“生疏”,我无法下载您的链接数据,因此我已将此工作流程应用于内置的数控数据集。您的偏移量可能与实际数据的 CRS 有所不同。

加载包和示例地图数据:

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

# Example data
mapdata <- st_read(system.file("shape/nc.shp", package = "sf"))

生成标签几何形状:

# Create centroids of municipalities (you can safely ignore the warning)
sf_centroids <- mapdata %>%
  st_centroid() %>%
  filter(NAME %in% c("Watauga", "Swain")) # proxies for your municipalities

# Create points for label locations
sf_labels <- sf_centroids %>%
  mutate(lon = st_coordinates(.)[,1] - 0.5,
         lat = st_coordinates(.)[,2] + 0.5) %>%
  st_drop_geometry() %>%
  st_as_sf(coords = c("lon", "lat")) %>%
  st_set_crs(st_crs(sf_centroids))

# Create lines between label locations and centroids
sf_lines <- rbind(sf_labels[,"NAME"], 
                  sf_centroids[,"NAME"]) %>%
  group_by(NAME) %>%
  summarise(geometry = st_union(geometry)) %>%
  st_cast("LINESTRING")

创建标签列表并绘图:

# Create labels
labels1 <- c("Exp's 2-3 - Northern Norway:", "Exp 1 - Sunnmøre:")
labels2 <- c("Bokmål vs. Northern Norwegian Dialect", "Bokmål")

# Plot labels using geo_sf_text
ggplot() + 
  geom_sf(data = mapdata) +
  geom_sf(data = sf_lines, linewidth = 0.15) +
  geom_sf(data = sf_labels, shape = 21, fill = "white", size = 0.75) +
  geom_sf(data = sf_centroids, size = 0.75) +
  geom_sf_text(data = sf_labels,
               aes(label = labels1),
               size = 2,
               vjust = -2,
               fun.geometry = st_centroid,
               colour = "black") +
  geom_sf_text(data = sf_labels,
               aes(label = labels2),
               size = 1.5,
               vjust = -1,
               fun.geometry = st_centroid,
               colour = "black") +
  coord_sf(clip = "off") +
  theme_void()

© www.soinside.com 2019 - 2024. All rights reserved.