在ggplot2地图上实现两种独立的颜色渐变比例尺
我来帮你搞定这个双比例尺地图的问题!其实你之前尝试子集划分的思路是对的,只是需要把不同区域的图层分开绘制,分别指定对应的颜色渐变,再叠加到同一张地图上就行。下面用R的ggplot2结合常用地图工具来实现,步骤超清晰:
双比例尺世界地图实现方案
1. 加载必备工具包
先加载处理数据和绘制地图的核心包:
library(ggplot2) library(dplyr) library(maps) # 用于获取基础世界地图数据
2. 准备你的数据
先把你提供的示例数据转换成标准数据框,同时统一地图匹配的国家名称(比如地图里美国叫"USA",需要和你的数据对齐):
# 构建你的数据框 df <- data.frame( country = c("Canada", "United States", "Mexico", "Germany", "France", "Spain"), responses = c(150, 70, 65, 120, 55, 71), area = c("northamerica", "northamerica", "northamerica", "europe", "europe", "europe") ) # 统一国家名称,确保和地图数据匹配 df <- df %>% mutate(country = ifelse(country == "United States", "USA", country))
3. 匹配地图与你的数据
获取世界地图的多边形数据,然后和你的响应数据做关联:
# 获取世界地图的经纬度多边形数据 world_map <- map_data("world") # 合并地图数据和你的响应数据 map_data_merged <- world_map %>% left_join(df, by = c("region" = "country"))
4. 绘制双渐变地图
核心逻辑是分三层绘制:底层放未匹配的其他国家(浅灰色),中层放北美国家(蓝色渐变),顶层放欧洲国家(红色渐变),这样就能实现两种独立的颜色比例尺:
ggplot() + # 底层:未匹配的其他国家用浅灰色填充 geom_polygon( data = map_data_merged %>% filter(is.na(area)), aes(x = long, y = lat, group = group), fill = "#e0e0e0", color = "white" ) + # 中层:北美国家用蓝色渐变,绑定responses数值 geom_polygon( data = map_data_merged %>% filter(area == "northamerica"), aes(x = long, y = lat, group = group, fill = responses), color = "white" ) + # 顶层:欧洲国家用红色渐变,绑定responses数值 geom_polygon( data = map_data_merged %>% filter(area == "europe"), aes(x = long, y = lat, group = group, fill = responses), color = "white" ) + # 为北美设置蓝色渐变比例尺 scale_fill_gradientn( colors = c("lightblue", "navy"), limits = range(df$responses[df$area == "northamerica"]), name = "北美响应数" ) + # 为欧洲设置红色渐变比例尺 scale_fill_gradientn( colors = c("lightpink", "darkred"), limits = range(df$responses[df$area == "europe"]), name = "欧洲响应数" ) + # 调整地图投影和极简主题 coord_map("mercator") + theme_minimal() + theme( axis.text = element_blank(), axis.title = element_blank(), panel.grid = element_blank() )
关键注意点
- 之所以要分图层绘制,是因为
ggplot2默认只支持一个主填充比例尺,拆分图层后就能为不同区域单独设置渐变规则 - 一定要注意国家名称的一致性,比如地图里的"USA"对应你的"United States",这类细节很容易导致匹配失败
- 如果你用
sf包的高精度地图数据,核心思路完全一致:拆分不同区域的sf对象,分别绘制即可
内容的提问来源于stack exchange,提问作者KTietjen
相关产品推荐
相关产品推荐

