如何在世界地图上叠加热力图与散点饼图?代码报错求解
问题解决:连续值传入离散尺度报错
报错原因
你的代码同时使用了连续填充尺度(对应热力图的Cases变量,用scale_fill_gradient定义)和离散填充尺度(对应散点饼图的Group1/Group2类别),而ggplot默认只允许一个填充尺度,两者冲突导致报错。
解决方案
使用ggnewscale包添加独立的填充尺度,让热力图和散点饼图的填充规则互不干扰。具体步骤:
- 安装并加载
ggnewscale包 - 在绘制散点饼图前调用
new_scale_fill(),开启新的填充尺度 - 给散点饼图的类别设置离散颜色尺度
修改后的完整代码
library(ggplot2) library(scatterpie) library(ggnewscale) # 新增包 world_map <- map_data("world") df <- data.frame(Country = c("USA", "Canada", "Mexico"), Cases = c(10, 20, 30)) df_piechart <- data.frame(long = c(-95, -110, -75), lat = c(37, 60, 20), size = c(5, 10, 15), Group1 = c(20, 30, 50), Group2 = c(30, 40, 30)) ggplot() + # 绘制基础世界地图 geom_map(dat = world_map, map = world_map, aes(map_id = region), color = "white", fill = "#d3d4d3", linewidth = 0.5, alpha=0.4 ) + # 绘制热力图(Cases连续变量) geom_map(dat = df, map = world_map, aes(map_id = Country, fill = Cases), linewidth = 0.5) + scale_fill_gradient(low = "skyblue", high = "dodgerblue4", name = "Avian Cases") + # 开启新的填充尺度,用于散点饼图 new_scale_fill() + # 绘制散点饼图(Group1/Group2离散类别) geom_scatterpie(data = df_piechart, aes(x = long, y = lat, r = size/50), # 调整r值避免饼图过大 cols = c("Group1", "Group2"), alpha = 0.8) + scale_fill_manual(values = c("Group1" = "orange", "Group2" = "darkgreen"), name = "Groups") + expand_limits(x = world_map$long, y = world_map$lat) + theme(legend.text = element_text(size = 8, family = "serif"), legend.title = element_text(size = 8, face = "bold", family = "serif"), legend.key.height = unit(0.2, 'cm'), legend.key.width = unit(0.2, 'cm')) + theme_void()
额外说明
- 调整了
geom_scatterpie的r参数(除以50),原size值过大导致饼图超出地图范围,可根据需求自行调整 - 用
scale_fill_manual给饼图的两个组设置了自定义颜色,可替换为你需要的配色
内容的提问来源于stack exchange,提问作者star
相关产品推荐
相关产品推荐

