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

ggplot2如何结合plot_usmap/geom_polygon在美国地图上叠加饼图

代码失效核心原因
  • 第一段代码错误使用+拼接两个独立的ggplot对象,ggplot不支持这种叠加方式,运行后只会保留后一个图的内容
  • 两段代码都存在坐标系统不统一的问题:plot_usmap默认使用EPSG:2163投影,若饼图点位数据的坐标是经纬度或其他投影坐标系,会和底图坐标范围不匹配,导致饼图错位甚至完全显示在绘图区外
  • 州底图的数值填充、饼图的燃料类型填充都调用了fill美学,直接叠加会出现映射冲突,导致图例混乱、填充色错乱
  • 分面时如果任意图层的数据缺失growth、emission分面字段,会出现所有分面重复叠加全部图层元素的问题
可行实现方案

核心逻辑是统一所有图层的坐标投影,拆分两套独立的填充色映射,保证所有图层数据对齐分面字段,完整代码如下:

# 加载所需依赖包
library(ggplot2)
library(usmap)
library(scatterpie)
library(ggnewscale)
library(dplyr)

# ----------------------
# 第一步:数据预处理
# ----------------------
# 提取美国本土州边界数据,排除阿拉斯加、夏威夷
states_map <- us_map(regions = "states", exclude = c("AK", "HI"))

# 将饼图点位的经纬度转换为和usmap一致的投影坐标
# 注意:把input_names里的lon、lat替换成你自己点位数据里的经度、纬度列名
total_proj <- usmap_transform(
  total,
  input_names = c("lon", "lat")
)
# 转换完成后total_proj里会自动生成匹配底图的x、y坐标列
# 请确认states_data和total_proj都包含growth、emission两个分面字段,分组值完全对应

# ----------------------
# 第二步:绘图
# ----------------------
ggplot() +
  # 绘制州级底图,按发电数值填充
  geom_polygon(
    data = states_data,
    aes(x = x, y = y, group = group, fill = value),
    color = "gray30", linewidth = 0.2
  ) +
  scale_fill_continuous(
    low = "white", high = "red",
    name = "Ele gen (EJ)",
    label = scales::comma
  ) +
  # 新建独立填充色标度,供饼图使用,解决映射冲突
  new_scale_fill() +
  # 叠加饼图图层
  geom_scatterpie(
    data = total_proj,
    aes(x = x, y = y, group = region),
    cols = "fuel",
    pie_scale = 1.3,
    long_format = TRUE,
    color = NA
  ) +
  scale_fill_manual(
    values = mypal[names(mypal) %in% total_proj$fuel],
    name = "Fuel type" # 替换为你需要的燃料类型图例标题
  ) +
  # 叠加区域标签
  geom_text(
    data = total_proj,
    aes(x = x, y = y, label = region),
    size = 4, family = "serif",
    vjust = 1.2, nudge_y = -50000,
    check_overlap = TRUE
  ) +
  # 分面设置
  facet_grid(growth ~ emission) +
  # 保持坐标等比例,避免地图变形
  coord_equal() +
  # 主题调整
  ggthemes::theme_map() +
  theme(
    legend.position = "bottom",
    legend.title = element_text(family = "sans", face = "bold", size = 12),
    legend.text = element_text(family = "sans", size = 11),
    strip.text = element_text(family = "sans", size = 14),
    panel.background = element_rect(fill = NA, color = "gray")
  )
调参注意事项
  • 若你的点位数据原本不是WGS84经纬度,可先将点位和州边界统一转换为同一投影坐标系,确保两者坐标范围完全匹配,避免饼图错位
  • 原代码中nudge_y = -100000数值过大,usmap投影下美国本土坐标范围有限,过大的偏移量会导致标签飘到其他区域,可根据实际显示效果微调偏移值
  • pie_scale参数可根据饼图数值的量级调整,避免饼图过大遮挡州边界,或过小难以辨识

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 13:54:05