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

在R中结合plot_usmap(带颜色)与geom_scatterpie绘制地图

解决方案:合并plot_usmap着色地图与geom_scatterpie饼图

当然可以合并,问题通常出在坐标系统匹配或图层调用逻辑上。plot_usmap基于albersusa投影,geom_scatterpie需要使用对应投影下的坐标,不能直接用经纬度。以下是可直接运行的完整代码示例:

步骤1:加载依赖包

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

步骤2:准备数据

获取州中心坐标(匹配plot_usmap的投影)

# 提取各州投影坐标系下的中心坐标
state_centers <- usmapdata::centroid("states")
state_centers$abbr <- fips_to_abbr(state_centers$fips) # 添加州缩写用于数据匹配

准备着色用的州级数据(示例用人口密度)

color_data <- usmapdata::statepop
color_data$pop_density <- color_data$pop / color_data$area # 计算人口密度作为着色变量

准备饼图数据(每个州对应多分类数值)

pie_data <- state_centers %>%
  mutate(
    category1 = runif(n(), 1, 15), # 示例分类1数值
    category2 = runif(n(), 1, 15), # 示例分类2数值
    category3 = runif(n(), 1, 15)  # 示例分类3数值
  )

步骤3:合并绘图

# 先绘制着色地图,再叠加饼图层
final_map <- plot_usmap(
    data = color_data, 
    values = "pop_density", 
    color = "white" # 州边界颜色
  ) +
  scale_fill_viridis_c(name = "人口密度\n(人/平方公里)") + # 着色图例
  # 添加饼图,使用投影坐标系下的中心坐标
  geom_scatterpie(
    data = pie_data,
    aes(x = x, y = y),
    cols = c("category1", "category2", "category3"), # 饼图分类列
    radius = 120000, # 饼图半径(单位:米,根据地图大小调整)
    alpha = 0.7 # 半透明,保留下方州的着色效果
  ) +
  scale_fill_manual(
    name = "饼图分类",
    values = c("category1" = "#E63946", "category2" = "#457B9D", "category3" = "#1D3557")
  ) +
  theme(legend.position = "right")

print(final_map)

关键注意事项

  • 坐标匹配:必须使用usmap提供的centroid()获取投影后的坐标,不能用经纬度,否则饼图会偏离州的位置。
  • 图层顺序:plot_usmap先绘制州填充,geom_scatterpie叠加在上方,设置alpha参数可以避免完全遮挡下方的着色。
  • 半径调整:albers投影的单位是米,半径数值要根据地图缩放程度调整,比如小州用更小的半径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:35:28