我想使用 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
)
除非您使用数百个标签,否则
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()