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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:16:35