如何用ggplot叠加不同数据集地图,高亮双条件共同区域?
问题描述
我想用同一个shapefile(脚本里叫prov2022),基于两个不同数据集分别绘制了两张地图,现在想把它们合并成一张——只填充同时满足以下两个条件的区域,其余区域设为白色:
- 条件1:
Real Wage >=400 且 Real Wage <=800 - 条件2:
PPP Wage >=400 且 PPP Wage <=800
数据集示例
数据集1(Real Wage)
COD_PROV Real Wage 1 530 1 520 1 410 2 300 2 205 2 501 13 700 13 800 13 900 18 440 18 590 18 620 19 340 19 590 19 320
数据集2(PPP Wage)
COD_PROV PPP Wage 1 130 1 620 1 510 2 400 2 255 2 601 13 754 13 600 13 950 18 350 18 690 18 520 19 640 19 790 19 720
原绘图脚本
地图1(基于数据集1)
right_join(prov2022, dataset1, by = "COD_PROV") %>% ggplot(aes( fill = `Real Wage` >= 400 & `Real Wage` <= 800)) + geom_sf() + theme_void() + theme(legend.position = "none", legend.title=element_blank())+ scale_fill_manual(values = c('white', 'orange'))
地图2(基于数据集2)
right_join(prov2022, dataset2, by = "COD_PROV") %>% ggplot(aes( fill = `PPP Wage` >= 400 & `PPP Wage` <= 800)) + geom_sf() + theme_void() + theme(legend.position = "none", legend.title=element_blank())+ scale_fill_manual(values = c('white', 'orange'))
解决方案
完全可以实现,核心思路是先把两个数据集的条件判断结果按区域编码(COD_PROV)汇总,再关联shapefile,最后基于双重条件控制填充色。
具体步骤及代码如下:
- 预处理数据集:对每个
COD_PROV,判断是否满足对应工资区间条件(默认逻辑是区域内至少有一条记录满足,若需所有记录都满足,把any()替换为all()) - 合并条件结果:将两个数据集的判断结果按
COD_PROV合并 - 关联地图数据并绘图:计算同时满足两个条件的逻辑值,用该值控制区域填充色
# 处理数据集1:判断每个区域是否满足Real Wage区间条件 dataset1_processed <- dataset1 %>% group_by(COD_PROV) %>% summarise(real_wage_ok = any(`Real Wage` >= 400 & `Real Wage` <= 800)) # 处理数据集2:判断每个区域是否满足PPP Wage区间条件 dataset2_processed <- dataset2 %>% group_by(COD_PROV) %>% summarise(ppp_wage_ok = any(`PPP Wage` >= 400 & `PPP Wage` <= 800)) # 关联shapefile并绘制目标地图 prov2022 %>% left_join(dataset1_processed, by = "COD_PROV") %>% left_join(dataset2_processed, by = "COD_PROV") %>% # 计算同时满足两个条件的逻辑值,无对应数据的区域设为不满足 mutate(both_ok = !is.na(real_wage_ok) & !is.na(ppp_wage_ok) & real_wage_ok & ppp_wage_ok) %>% ggplot(aes(fill = both_ok)) + geom_sf() + theme_void() + theme(legend.position = "none", legend.title = element_blank()) + scale_fill_manual(values = c('white', 'orange'))
关键说明
- 用
group_by()+summarise()汇总区域级的条件结果,避免shapefile关联后出现重复几何对象 !is.na()用于处理在某个数据集中无对应编码的区域,确保这些区域不会被错误填充- 可根据需求调整
any()/all(),切换"区域内至少一条记录满足"或"所有记录都满足"的判断逻辑
内容的提问来源于stack exchange,提问作者io_boh
相关产品推荐
相关产品推荐

