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

使用ggplot2绘制美国本土48州着色地图出现图形异常求助

问题解决:美国本土48州地图绘制异常修复

核心问题原因

  • merge() 函数会打乱us_map返回数据的原始顶点顺序,geom_polygon依赖顶点顺序绘制多边形,顺序错乱会导致图形破碎、空白。
  • 原始数据包含阿拉斯加(AK)和夏威夷(HI),不符合"本土48州"的需求,且这两个州的坐标会干扰地图布局。

修正后的代码方案

推荐使用usmap包自带的plot_usmap()函数,它会自动处理多边形顺序和坐标布局,避免手动操作的错误:

install.packages("usmap")
install.packages("ggplot2")

library(usmap)
library(ggplot2)

# 生成仅包含本土48州的排名数据(剔除AK、HI)
state_rankings <- data.frame(
  state = c("AL", "AZ", "AR", "CA", "CO", "CT",
            "DE", "FL", "GA", "ID", "IL", "IN",
            "IA", "KS", "KY", "LA", "ME", "MD", "MA",
            "MI", "MN", "MS", "MO", "MT", "NE", "NV",
            "NH", "NJ", "NM", "NY", "NC", "ND", "OH",
            "OK", "OR", "PA", "RI", "SC", "SD", "TN",
            "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"),
  ranking = runif(48, min = -2, max = 2)
)

# 使用usmap专用绘图函数,自动处理多边形顺序和布局
plot_usmap(data = state_rankings, values = "ranking", color = "black") +
  scale_fill_gradient2(
    low = "red", 
    mid = "white", 
    high = "green", 
    midpoint = 0,
    limits = c(-2, 2)  # 固定颜色映射范围,确保深浅对应-2到2的程度
  ) +
  theme_void() +
  theme(legend.position = "bottom")

手动处理ggplot的替代方案(若需自定义更多细节)

如果一定要直接用ggplot()处理原始多边形数据,需要保证合并后的数据保留原始顶点顺序,可以用dplyr::left_join替代merge,并按order列排序:

install.packages(c("usmap", "ggplot2", "dplyr"))

library(usmap)
library(ggplot2)
library(dplyr)

# 生成本土48州排名数据
state_rankings <- data.frame(
  state = c("AL", "AZ", "AR", "CA", "CO", "CT",
            "DE", "FL", "GA", "ID", "IL", "IN",
            "IA", "KS", "KY", "LA", "ME", "MD", "MA",
            "MI", "MN", "MS", "MO", "MT", "NE", "NV",
            "NH", "NJ", "NM", "NY", "NC", "ND", "OH",
            "OK", "OR", "PA", "RI", "SC", "SD", "TN",
            "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"),
  ranking = runif(48, min = -2, max = 2)
)

# 获取本土48州的多边形数据(剔除AK、HI)
state_map <- us_map(regions = "states") %>%
  filter(!abbr %in% c("AK", "HI"))

# 用left_join合并,保留原始顺序,再按order排序确保顶点正确
state_map_rankings <- left_join(state_map, state_rankings, by.x = "abbr", by.y = "state") %>%
  arrange(order)

# 绘制地图
ggplot(state_map_rankings, aes(x = x, y = y, group = group, fill = ranking)) +
  geom_polygon(color = "black") +
  scale_fill_gradient2(low = "red", mid = "white", high = "green", midpoint = 0, limits = c(-2,2)) +
  theme_void() +
  theme(legend.position = "bottom") +
  coord_equal()  # 保证地图比例正确,避免拉伸

关键说明

  • scale_fill_gradient2中添加limits = c(-2,2)可以确保颜色深浅严格对应-2到2的排名范围,即使样本数据没有触及边界值,颜色映射也会保持一致。
  • coord_equal()用于保持地图的正确比例,避免图形被拉伸变形。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:37:50