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

如何在R的usmap包中叠加州边界与县热力地图?

如何在县级热力地图中让州边界更显眼

我需要在县级热力地图上清晰显示州边界,但现有代码的州边界不够突出,尝试了两段代码都没解决问题。

原始代码片段1

# 获取所有州的多边形数据
states_sf <- get_urbn_map(map = "states", sf = TRUE)

# 筛选指定州的多边形数据
selected_states <- c("AL", "AR", "CT", "DC", "DE", "FL", "GA", "LA", 
                     "MA", "MD", "ME", "MS", "NC", "NH", "NJ", "NY", 
                     "PA", "RI", "SC", "TX", "VA", "VT", "WV")
selected_states_sf <- states_sf[states_sf$ST %in% selected_states, ]

# 假设Hurricane$total_wind是数值型变量
plot_usmap("counties", data = Hurricane, values = "total_wind",
           include = selected_states,
           color = "black"
) +
  ggplot2::scale_fill_continuous(low = "snow2", high = "red", guide = FALSE) +
  geom_sf(data = selected_states_sf, fill = NA, color = "black", size = 0.5) +  # 调整州边界线宽
  theme_minimal() +
  
  # 移除网格线
  coord_sf(datum = NA, crs = st_crs(states_sf)) +   # 显式设置坐标系
  labs(fill = "Random Data") + 
  scale_fill_gradient2(low='snow2', high='red') + 
  theme_bw() + 
  theme(
    # 隐藏面板边框和网格线
    panel.border = element_blank()
  )

原始代码片段2

plot_usmap("counties", data = Hurricane, values = "total_wind",
           include = c("AL", "AR", "CT", "DC", "DE", "FL", "GA", "LA", 
                       "MA", "MD", "ME", "MS", "NC", "NH", "NJ", "NY", 
                       "PA", "RI", "SC", "TX", "VA", "VT", "WV")
) +
  ggplot2::scale_fill_continuous(low = "ghostwhite", high = "red", guide = FALSE)

问题分析

  • 片段1的问题:
    1. 重复调用填充比例尺(scale_fill_continuous和scale_fill_gradient2),后者会覆盖前者,造成冗余。
    2. geom_sf叠加的州边界因坐标系不匹配(plot_usmap默认Albers投影,与get_urbn_map的CRS不一致)导致显示异常,且size=0.5的线宽仍不够突出。
    3. 同时使用theme_minimal()和theme_bw(),主题设置冲突,干扰边界显示。
  • 片段2的问题:完全没有添加州边界绘制逻辑,自然看不到州边界。

解决方案

方案1:直接用plot_usmap内置参数设置州边界

plot_usmap支持直接绘制州边界,无需额外导入sf数据,坐标系自动匹配,操作更简洁:

selected_states <- c("AL", "AR", "CT", "DC", "DE", "FL", "GA", "LA", 
                     "MA", "MD", "ME", "MS", "NC", "NH", "NJ", "NY", 
                     "PA", "RI", "SC", "TX", "VA", "VT", "WV")

# 先绘制县级热力图,再叠加州边界(确保州边界在最上层)
plot_usmap(regions = "counties", data = Hurricane, values = "total_wind",
           include = selected_states,
           fill = "total_wind",
           color = "gray80"  # 县级边界设为浅灰色,避免和州边界冲突
) +
  # 叠加州边界,设置粗线宽和高对比色
  plot_usmap(regions = "states", include = selected_states,
             fill = NA, color = "black", size = 1.2) +
  scale_fill_gradient2(low = "snow2", high = "red", guide = FALSE) +
  labs(fill = "总风速") +
  theme_bw() +
  theme(
    panel.border = element_blank(),
    axis.text = element_blank(),
    axis.title = element_blank()
  )

方案2:修复sf数据叠加的问题

如果坚持用sf数据叠加,需统一坐标系并调整绘制参数:

library(usmap)
library(sf)
library(ggplot2)

# 获取州数据并转换为usmap默认的Albers投影
states_sf <- get_urbn_map(map = "states", sf = TRUE) %>%
  st_transform(crs = usmap_crs())

selected_states <- c("AL", "AR", "CT", "DC", "DE", "FL", "GA", "LA", 
                     "MA", "MD", "ME", "MS", "NC", "NH", "NJ", "NY", 
                     "PA", "RI", "SC", "TX", "VA", "VT", "WV")
selected_states_sf <- states_sf[states_sf$ST %in% selected_states, ]

plot_usmap("counties", data = Hurricane, values = "total_wind",
           include = selected_states,
           color = "gray80"
) +
  scale_fill_gradient2(low = "snow2", high = "red", guide = FALSE) +
  # 叠加州边界,设置粗线宽,关闭美学参数继承
  geom_sf(data = selected_states_sf, fill = NA, color = "black", size = 1.2, inherit.aes = FALSE) +
  theme_bw() +
  theme(
    panel.border = element_blank(),
    axis.text = element_blank(),
    axis.title = element_blank()
  )

关键调整点:

  • 把县级边界设为浅灰色,与黑色州边界形成对比,突出州边界层级。
  • 州边界线宽调整为1.2左右,确保视觉上足够显眼。
  • 方案2中需统一坐标系,避免边界错位。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 14:38:35