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

