在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
相关产品推荐
相关产品推荐

