You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 10:55:50