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

geom_sf_label的position dodge无效,美国州地图标签重叠问题

解决美国州地图geom_sf_label标签重叠问题

问题原因

position_dodge/position_dodge2是为分组数据设计的(比如同一类别下多组元素需要横向/纵向错开),但你的地图中每个州是独立的几何对象,没有设置分组变量,因此调整width参数完全起不到分散标签的作用,这就是东部标签依旧重叠的核心原因。

解决方案

方案1:使用ggrepel自动排斥重叠标签(推荐)

ggrepel包的geom_sf_label_repel可以自动计算标签位置,避开几何对象和其他标签,是解决地图标签重叠最省心的方法。

修改后的完整代码:

library(tidyverse)
library(sf)
library(tigris)
library(viridis)
library(ggrepel) # 加载ggrepel包

us_states <- states(cb = TRUE, resolution = "20m")
us_states_shifted <- shift_geometry(us_states)

us_states_shifted %>% 
  ggplot(aes(fill = AWATER)) +
  geom_sf() +
  scale_fill_viridis(option = 'cividis') +
  # 替换为geom_sf_label_repel,自动处理重叠
  geom_sf_label_repel(aes(label = NAME), 
                      size = 2, 
                      fill = "white",
                      force = 1.5, # 控制标签排斥力度,数值越大分散效果越强
                      # 可选:手动调整阿拉斯加、夏威夷的标签位置避免偏离
                      nudge_x = c(rep(0, 48), -2, -2),
                      nudge_y = c(rep(0, 48), 5, 5)) +
  theme_void() +
  theme(legend.position = "none") +
  ggtitle("美国各州水域面积")

方案2:手动调整标签中心点

如果需要更精准的标签位置控制,可以手动计算并调整各州的中心点坐标,再基于调整后的点添加标签:

library(tidyverse)
library(sf)
library(tigris)
library(viridis)

us_states <- states(cb = TRUE, resolution = "20m")
us_states_shifted <- shift_geometry(us_states)

# 计算中心点并手动调整东部密集州的坐标
us_states_centered <- us_states_shifted %>%
  mutate(centroid = st_centroid(geometry),
         centroid_x = st_coordinates(centroid)[,1],
         centroid_y = st_coordinates(centroid)[,2]) %>%
  # 根据实际重叠情况调整对应州的坐标
  mutate(centroid_x = case_when(
    NAME == "Connecticut" ~ centroid_x + 0.5,
    NAME == "Rhode Island" ~ centroid_x - 0.5,
    NAME == "Massachusetts" ~ centroid_x + 0.3,
    NAME == "New Hampshire" ~ centroid_x - 0.3,
    TRUE ~ centroid_x
  ),
  centroid_y = case_when(
    NAME == "Vermont" ~ centroid_y + 0.4,
    NAME == "Delaware" ~ centroid_y - 0.3,
    TRUE ~ centroid_y
  )) %>%
  st_drop_geometry() %>%
  st_as_sf(coords = c("centroid_x", "centroid_y"), crs = st_crs(us_states_shifted))

# 绘制地图,使用调整后的中心点添加标签
us_states_shifted %>% 
  ggplot(aes(fill = AWATER)) +
  geom_sf() +
  scale_fill_viridis(option = 'cividis') +
  geom_sf_label(data = us_states_centered, aes(label = NAME), 
                size = 2, fill = "white") +
  theme_void() +
  theme(legend.position = "none") +
  ggtitle("美国各州水域面积")

方案3:使用抖动位置缓解轻度重叠

如果只是轻微重叠,可以用position_jitter给标签添加随机偏移,但密集区域效果有限:

us_states_shifted %>% 
  ggplot(aes(fill = AWATER)) +
  geom_sf() +
  scale_fill_viridis(option = 'cividis') +
  geom_sf_text(aes(label = NAME), size = 2, 
               position = position_jitter(width = 0.3, height = 0.3)) +
  theme_void() +
  theme(legend.position = "none") +
  ggtitle("美国各州水域面积")

内容的提问来源于stack exchange,提问作者LowlyAnalyst

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 14:55:13