RStudio中埃塞俄比亚分级统计图的分段与统一配色设置问题
问题描述
我需要绘制埃塞俄比亚各Zone(县)的境内流离失所者(IDPs)占总人口百分比的分级统计图,已完成以下操作:
- 导入埃塞俄比亚Shapefile(
Ethiopia_geoboundaries_ADM2)和IDP百分比数据(Ethiopia_Rmap) - 完成两个数据集的合并
但使用spplot绘图时,颜色范围仅适配当前数据的取值范围,由于需要和其他国家的结果对比,希望设置统一的分段区间:<5%、5-10%、10-25%、25-50%、50-75%、75%+。
当前代码
setwd("~/Documents/Acumen_Data/IDMC_Map_Data/Ethiopia") library(spdep) library(rgdal) library(sf) library(terra) Ethiopia_Rmap <- read_excel("Ethiopia_Rmap.xlsx") Ethiopia_geoBoundaries_ADM2 <- readOGR(dsn = ".", layer = "eth_admbnda_adm2_csa_bofedb_2021") Ethiopia_Static_Map = merge(Ethiopia_geoBoundaries_ADM2,Ethiopia_Rmap,by.x="ADM2_EN",by.y="Zone") ColourPalette = brewer.pal(n=7, name="PuBu") spplot(Ethiopia_Static_Map,"IDP_Perc", col.regions=ColourPalette)
Ethiopia_Rmap数据结构
Ethiopia_Rmap = structure( list( Region = c( "Afar", "Afar", "Afar", "Afar", "Afar", "Amhara", "Amhara", "Amhara", "Amhara", "Amhara", "Amhara", "Amhara", "Amhara", "Amhara", "Amhara", "Amhara", "Benishangul-Gumuz Region", "Benishangul-Gumuz Region", "Gambela", "Gambela", "Harari", "Oromia", "Oromia", "Oromia", "Oromia", "Oromia", "Oromia", "Oromia", "Oromia", "Oromia" ), Zone = c( "Aswi /Zone 1", "Fanti /Zone 4", "Gabi /Zone 3", "Hari /Zone 5", "Kilbati /Zone 2", "Argoba (special Woreda)", "Awi", "East Gojam", "North Gondar", "North Shewa (AM)", "North Wello", "Oromia", "South Gondar", "South Wello", "Wag Hamra", "West Gojam", "Assosa", "Metekel", "Agnewak", "Nuwer", "Harari", "Arsi", "Bale", "Borena", "East Hararge", "East Wellega", "Guji", "Horo Gudru Wallega", "Jimma", "Kelem Wallega" ), IDP_Population = c( 22668, 1531, 28011, 2580, 41786, 4498, 28622, 20633, 25407, 66296, 30243, 7370, 28704, 24292, 39834, 143028, 28603, 94798, 5296, 39208, 3037, 4064, 10650, 220540, 143853, 140374, 100972, 42496, 14893, 26351 ), Total_Population = c( 641584, 333296, 328636, 254909, 489698, 42250, 1328104, 2845753, 4066517, 2464232, 1989563, 611456, 2701503, 3387395, 548884, 2755600, 492344, 441297, 204358, 172105, 283000, 3980967, 2119829, 1431922, 4035797, 1847649, 2073775, 859339, 3638103, 1191582 ), IDP_Perc = c( 3.53, 0.46, 8.52, 1.01, 8.53, 10.65, 2.16, 0.73, 0.62, 2.69, 1.52, 1.21, 1.06, 0.72, 7.09, 5.19, 5.81, 21.48, 2.59, 22.78, 1.07, 0.1, 0.5, 15.4, 3.56, 7.6, 4.87, 4.95, 0.41, 2.21 ) ), row.names = c(NA,-30L), class = c("tbl_df", "tbl", "data.frame") )
解决方案
要实现统一分段的分级统计图,核心是先将IDP_Perc变量按照指定区间离散化,再传递给spplot。具体步骤如下:
1. 定义统一分段区间
设定分段阈值,用cut()函数将连续百分比转换为分类变量:
# 定义分段阈值 breaks <- c(0, 5, 10, 25, 50, 75, Inf) # 定义分段标签 labels <- c("<5%", "5-10%", "10-25%", "25-50%", "50-75%", "75%+") # 对IDP_Perc进行离散化,添加到合并后的空间数据中 Ethiopia_Static_Map$IDP_Perc_Cat <- cut( Ethiopia_Static_Map$IDP_Perc, breaks = breaks, labels = labels, include.lowest = TRUE # 确保0%左右的数值被包含在第一个区间 )
2. 调整颜色与绘图
由于有6个分段区间,对应选择6种颜色,再基于离散化后的分类变量绘图:
library(RColorBrewer) # 匹配6个区间的颜色 ColourPalette <- brewer.pal(n=6, name="PuBu") # 使用离散化变量绘图 spplot( Ethiopia_Static_Map, "IDP_Perc_Cat", col.regions = ColourPalette, main = "埃塞俄比亚各Zone境内流离失所者占总人口百分比", scales = list(draw = TRUE), # 显示比例尺 colorkey = list( labels = list(labels = labels), # 自定义图例标签 width = 1, # 调整图例宽度 height = 0.8 # 调整图例高度 ) )
关键说明
include.lowest=TRUE确保最小数值(如0.1%)被正确归类到<5%区间- 自定义图例标签让图表更直观,符合需求的分段表述
- 调整
colorkey参数可优化图例显示,方便与其他国家图表对比
内容的提问来源于stack exchange,提问作者Ben Jones
相关产品推荐
相关产品推荐

