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

如何用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,最后基于双重条件控制填充色。

具体步骤及代码如下:

  1. 预处理数据集:对每个COD_PROV,判断是否满足对应工资区间条件(默认逻辑是区域内至少有一条记录满足,若需所有记录都满足,把any()替换为all())
  2. 合并条件结果:将两个数据集的判断结果按COD_PROV合并
  3. 关联地图数据并绘图:计算同时满足两个条件的逻辑值,用该值控制区域填充色
# 处理数据集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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:45:43