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

R语言USmap地图优化:州缩写适配与文本轮廓技术问询

解决usmap绘制美国用户热力图的两个标注问题

问题1:小州缩写适配与标注引线

针对东北部小州(VA、MT、CT、NJ等)标注超出边界的问题,提供两种实用方案:

方案1:针对性缩小小州字体

给小州单独设置更小字号,避免标注溢出:

# 为指定小州设置专属字号,其余州用默认值
state_labels$text_size <- ifelse(state_labels$stateabbr %in% c("VA", "MT", "CT", "NJ"), 2.5, 3.5)

修改标注代码,引用自定义字号并隐藏无关图例:

geom_text(data = state_labels, aes(x = x, y = y, label = stateabbr, size = text_size), color = "white") +
guides(size = "none") # 隐藏字号对应的图例

方案2:自动添加标注引线(推荐)

使用ggrepel包的geom_text_repel自动调整标注位置并生成引线,彻底解决边界溢出和重叠问题:

# 先安装并加载包
install.packages("ggrepel")
library(ggrepel)

# 替换原geom_text为带引线的标注
geom_text_repel(data = state_labels, aes(x = x, y = y, label = stateabbr), 
                color = "white", size = 3.5, min.segment.length = 0.1)

min.segment.length参数控制引线触发的最小距离,设为0.1可确保小州都生成引线。

问题2:为白色文本添加轮廓

使用shadowtext包的geom_shadowtext给白色文本添加黑色轮廓,解决浅色背景下文本模糊的问题:

# 先安装并加载包
install.packages("shadowtext")
library(shadowtext)

如果用固定位置标注,替换为:

geom_shadowtext(data = state_labels, aes(x = x, y = y, label = stateabbr, size = text_size), 
                color = "white", bg.color = "black", bg.r = 0.1) +
guides(size = "none")

如果用引线标注,结合ggrepel的增强版函数(需ggrepel版本足够新):

geom_shadowtext_repel(data = state_labels, aes(x = x, y = y, label = stateabbr), 
                      color = "white", bg.color = "black", bg.r = 0.1, 
                      size = 3.5, min.segment.length = 0.1)

bg.r参数控制轮廓粗细,0.1是兼顾清晰和美观的常用值。

完整修改代码示例

library(usmap)
library(ggplot2)
library(RColorBrewer)
library(ggrepel)
library(shadowtext)

# 合并标注坐标与数据
centroid_labels <- usmapdata::centroid_labels("states") 
state_labels <- merge(statecounts, centroid_labels, by = "fips") 

# 定义配色方案
myPalette <- colorRampPalette(rev(brewer.pal(11, "RdYlBu")))

# 绘制带优化标注的热力图
usmap3 <- plot_usmap(data = statecounts, regions = "state", values = "n") +
  geom_shadowtext_repel(data = state_labels, aes(x = x, y = y, label = stateabbr), 
                        color = "white", bg.color = "black", bg.r = 0.1, 
                        size = 3.5, min.segment.length = 0.1) +
  scale_fill_gradientn(name = "Count", colours = myPalette(50)) +
  labs(title = "Frequency of Unique Users in the United States",
       caption = "",
       fill = "Count")
usmap3

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 02:10:35