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

R语言地图可视化求助:收入层级颜色分类无法正常显示

问题解决:世界地图按收入层级高亮指定国家

问题说明

需要制作世界地图,实现以下效果:

  • 高亮20个指定国家
  • 按世界银行收入层级对指定国家进行颜色编码
  • 保留其余国家为默认样式
    当前核心问题:颜色分类无法正常显示

已尝试操作:

  • 将国家转换为因子变量
  • 处理了存在多条目的国家

数据(R结构)

structure(list(region = c("Belgium", "Canada", "Cyprus", "Democratic Republic of the Congo", "Denmark", "Ghana", "Greece", "India", "Israel", "Italy", "Kenya", "Malaysia", "Nigeria", "Philippines", "Portugal", "Spain", "Sri Lanka", "Tanzania", "UK", "USA"), `Country by level of income (World Bank)` = c("High", "High", "High", "Low", "High", "Lower middle-income", "High", "Lower middle-income", "High", "High", "Lower middle-income", 
"Upper middle income", "Lower middle-income", "Lower middle-income", "High", "High", "Lower middle-income", "Lower middle-income", "High", "High"), Continent = c("Northern Europe", "North America", "Mediterranean", "Africa", "Northern Europe", "Africa", "Mediterranean", 
"South Asia", "Middle East", "Mediterranean", "Africa", "South East Asia", "Africa", "South East Asia", "Mediterranean", "Mediterranean", "South Asia", "Africa", "Northern Europe", "North America")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -20L))

问题诊断

代码存在三个关键问题:

  1. 填充参数引用错误:geom_polygon的aes中,你用双引号包裹了列名,导致程序把字符串当成填充值,而非引用实际数据列。含空格的列名需用反引号包裹。
  2. 国家名称不匹配:map_data("world")中的国家名称(如United Kingdom、United States)与你的数据(UK、USA)不一致,导致部分国家匹配失败无法高亮。
  3. 缺失值未定义:未指定无收入层级国家的默认颜色,导致这部分区域颜色异常。

修正后的代码

library(dplyr)
library(ggplot2)
library(maps)
library(extrafont)

options(scipen = 999)

# 加载世界地图基础数据
world <- map_data("world")

# 加载自定义收入数据并修正国家名称,匹配地图数据
country_income <- structure(list(region = c("Belgium", "Canada", "Cyprus", "Democratic Republic of the Congo", "Denmark", "Ghana", "Greece", "India", "Israel", "Italy", "Kenya", "Malaysia", "Nigeria", "Philippines", "Portugal", "Spain", "Sri Lanka", "Tanzania", "UK", "USA"), `Country by level of income (World Bank)` = c("High", "High", "High", "Low", "High", "Lower middle-income", "High", "Lower middle-income", "High", "High", "Lower middle-income", 
"Upper middle income", "Lower middle-income", "Lower middle-income", "High", "High", "Lower middle-income", "Lower middle-income", "High", "High"), Continent = c("Northern Europe", "North America", "Mediterranean", "Africa", "Northern Europe", "Africa", "Mediterranean", 
"South Asia", "Middle East", "Mediterranean", "Africa", "South East Asia", "Africa", "South East Asia", "Mediterranean", "Mediterranean", "South Asia", "Africa", "Northern Europe", "North America")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -20L))

country_income <- country_income %>%
  mutate(region = case_when(
    region == "UK" ~ "United Kingdom",
    region == "USA" ~ "United States",
    TRUE ~ region
  ))

# 合并地图数据与收入数据
country_income_map <- left_join(world, country_income, by = "region")

# 定义收入层级颜色映射
custom_colour_scale_income <- c(
  "High" = '#404E88', 
  "Upper middle income" = '#2A8A8C', 
  "Lower middle-income" = '#7FD157', 
  "Low" = '#F9E53F'
)

# 绘制最终地图
ggplot(country_income_map, aes(x = long, y = lat, group = group)) +
  geom_polygon(aes(fill = `Country by level of income (World Bank)`), colour = "#333333") +
  scale_fill_manual(
    values = custom_colour_scale_income,
    na.value = "#555555",  # 其余国家的默认填充色
    drop = FALSE           # 保留所有收入层级的图例项
  ) +
  guides(fill = guide_legend(reverse = TRUE)) +
  labs(
    fill = '收入层级',
    title = '各国响应情况与收入层级',
    x = NULL,
    y = NULL
  ) +
  coord_fixed(1.3) +
  theme(
    text = element_text(family="Gill Sans MT", color = '#EEEEEE'),
    plot.title = element_text(size = 28),
    axis.ticks = element_blank(),
    axis.text = element_blank(),
    panel.grid = element_blank(),
    panel.background = element_rect(fill = '#333333'),
    plot.background = element_rect(fill = '#333333'),
    legend.position = c(.18,.36),
    legend.background = element_blank(),
    legend.key = element_blank()
  )

效果说明

  • 指定的20个国家会按对应收入层级显示自定义颜色
  • 其余国家统一显示为灰色(可通过na.value参数调整颜色)
  • 图例完整保留所有收入层级选项,避免因无对应数据丢失项

内容的提问来源于stack exchange,提问作者Jobolo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 23:00:55