ggplot地图标注:如何将城市名称标签移至边界外部?
解决地图城市标签移至边界外的问题
先解决geom_sf_text_repel找不到的错误
geom_sf_text_repel是ggrepel包0.9.3及以上版本新增的适配sf对象的函数,旧版本会出现找不到的错误。执行以下代码升级并加载包:
install.packages("ggrepel") library(ggrepel)
升级后再运行你的原代码,即可正常使用该函数实现标签自动外移并避碰。
替代方法:手动偏移标签位置
如果不想依赖ggrepel新版本,可通过以下步骤手动将标签移至边界外:
步骤1:计算城市质心并生成偏移坐标
先筛选目标区域数据,计算每个城市的几何质心,再根据地图坐标系设置向外偏移的数值(数值大小需根据你的地图范围调整):
library(sf) library(ggplot2) # 处理数据,筛选目标区域 target_data <- right_join(prov2022, dataset, by = "COD_PROV") %>% subset(COD_REG == 7 | COD_REG >= 1 & COD_REG <= 3) # 计算城市质心 target_data <- target_data %>% mutate(centroid = st_centroid(geometry)) # 提取质心坐标并生成偏移后的标签位置 centroid_coords <- st_coordinates(target_data$centroid) target_data <- target_data %>% mutate( label_x = centroid_coords[, 1] + 0.5, # 横向偏移,根据地图调整数值 label_y = centroid_coords[, 2] + 0.5 # 纵向偏移,根据地图调整数值 )
步骤2:绘制带偏移标签的地图
使用geom_text基于偏移后的坐标绘制标签,避免标签落在城市边界内:
ggplot(target_data, aes(fill = `real wage`)) + geom_sf() + theme_void() + theme(legend.title = element_blank()) + geom_text(aes(x = label_x, y = label_y, label = city_name), size = 3) + scale_fill_gradientn(colors = c("#FFFFFF","#FFFF00", "#FF0000", "#000000"))
另一种替代:结合ggrepel的普通文本标签
如果想用ggrepel的自动避碰功能但不想用geom_sf_text_repel,可提取质心坐标作为文本位置,使用普通的geom_text_repel:
# 提取质心坐标为单独的数据框 label_data <- target_data %>% st_centroid() %>% st_coordinates() %>% as.data.frame() %>% mutate( city_name = target_data$city_name, real_wage = target_data$`real wage` ) ggplot(target_data, aes(fill = `real wage`)) + geom_sf() + theme_void() + theme(legend.title = element_blank()) + geom_text_repel(data = label_data, aes(x = X, y = Y, label = city_name), size = 3) + scale_fill_gradientn(colors = c("#FFFFFF","#FFFF00", "#FF0000", "#000000"))
内容的提问来源于stack exchange,提问作者io_boh
相关产品推荐
相关产品推荐

