如何为geom_sf绘制的地图添加带指引线的标注?
解决geom_sf地图添加带指引线的精准标注问题
核心问题
使用geom_sf()绘制挪威市政地图时,为南部的Volda和北部的Tromsø区域添加带指引线的标注,直接用质心配合geom_text_repel()效果不佳,需要更可靠的标注方案。
解决方案
通过提取区域内部点替代质心+手动微调标注位置的方式,实现精准的带指引线标注,具体步骤如下:
- 加载依赖包:需要
ggplot2、sf和ggrepel三个包 - 筛选目标数据:只保留需要标注的Volda和Tromsø市政数据
- 生成可靠标注起点:用
st_point_on_surface()生成区域内部的点(比质心更稳定,避免点落在区域外) - 调整标注参数:通过
nudge_x/nudge_y手动偏移标注位置,配合force参数控制指引线拉力
完整代码示例
# 加载所需包 library(ggplot2) library(sf) library(ggrepel) # 读取地图数据 mapdata <- st_read("~/Downloads/Basisdata_0000_Norge_25833_NorskeFylkerKommunerIllustrasjonsdata2021_GeoJSON/kommuner2021.json") # 处理标注数据:筛选目标市政+生成内部标注点 label_data <- mapdata %>% filter(Kommunenavn %in% c("Volda", "Tromsø")) %>% mutate(label_point = st_point_on_surface(geometry)) %>% st_set_geometry("label_point") %>% st_coordinates() %>% as.data.frame() %>% cbind(mapdata %>% filter(Kommunenavn %in% c("Volda", "Tromsø")) %>% select(Kommunenavn)) # 绘制地图并添加带指引线的标注 ggplot(mapdata) + geom_sf(fill = "#f0f0f0", color = "#333333") + geom_text_repel( data = label_data, aes(x = X, y = Y, label = Kommunenavn), nudge_x = c(50000, -80000), # 微调Volda右移、Tromsø左移 nudge_y = c(-10000, 20000), # 微调Volda下移、Tromsø上移 force = 2, # 控制标注间的排斥力度 segment.color = "#666666", # 指引线颜色 segment.size = 0.5, # 指引线粗细 size = 4 # 标注文字大小 ) + theme_minimal() + theme( panel.grid.major = element_blank(), panel.grid.minor = element_blank(), axis.text = element_blank(), axis.title = element_blank() )
关键说明
st_point_on_surface():确保标注的起点始终在市政区域内部,解决了质心可能落在区域外的问题nudge_x/nudge_y:根据地图的坐标范围(EPSG:25833,单位为米)手动调整,可根据实际显示效果微调数值force:数值越大,标注越不容易重叠,可根据需求调整
内容的提问来源于stack exchange,提问作者user9974638
相关产品推荐
相关产品推荐

