如何在rworldmap中自定义区域绘制聚合国家数据?
实现自定义区域的世界地图绘制
当然可以实现自定义区域的绘制!其实不用额外找其他包,rworldmap本身就能配合你自己的区域定义完成需求,甚至结合ggplot2还能做出更灵活的可视化效果。下面给你两种实用的实现方案:
方法一:直接用rworldmap配合自定义区域数据
这种方法适合想继续用rworldmap原生绘图函数的场景,步骤很清晰:
准备你的数据
确保你的数据框包含三个核心部分:iso3国家代码列、自定义区域列(比如命名为custom_region,用来标记每个国家所属的自定义分组,如"欧盟"、"高收入国家"),以及你要展示的数值列(比如value)。模拟数据示例:
library(rworldmap) library(dplyr) # 模拟你的数据结构 my_data <- data.frame( iso3 = c("FRA", "DEU", "GBR", "USA", "JPN", "BRA", "IND"), custom_region = c("欧盟", "欧盟", "欧盟", "高收入国家", "高收入国家", "新兴市场", "新兴市场"), value = c(100, 150, 120, 200, 180, 90, 80) )匹配地图与自定义数据
用joinCountryData2Map函数把你的数据和rworldmap内置的地图数据通过iso3代码关联起来:map_merged <- joinCountryData2Map(my_data, joinCode = "ISO3", nameJoinColumn = "iso3")按自定义区域绘图
直接调用mapCountryData,指定用你的自定义区域列来着色:mapCountryData(map_merged, nameColumnToPlot = "custom_region", catMethod = "categorical", # 因为是分类区域,用分类着色 mapTitle = "自定义区域世界地图", colourPalette = "Set3", borderCol = "white") # 加上白色边框区分国家如果需要先对自定义区域做数据聚合(比如计算每个区域的总和),可以先用dplyr分组汇总:
aggregated_region <- my_data %>% group_by(custom_region) %>% summarise(total_value = sum(value)) # 聚合后如果要和地图匹配,只需要确保每个国家的区域标签正确,绘图时按区域聚合着色即可
方法二:用ggplot2 + rworldmap实现更灵活的可视化
如果你想要更自由的样式调整,ggplot2是更好的选择,配合rworldmap的地图数据同样能轻松实现:
转换地图数据格式
把rworldmap的地图数据转换为ggplot支持的数据框格式:library(ggplot2) # 获取低分辨率世界地图(需要高分辨率可以改resolution为"high") world_map <- getMap(resolution = "low") world_df <- fortify(world_map, region = "ISO3") # 按iso3代码拆分地图数据合并自定义数据与地图
用left_join通过iso3代码关联你的数据和地图数据:merged_df <- left_join(world_df, my_data, by = c("id" = "iso3"))绘制自定义区域地图
用ggplot的多边形图层绘制,按自定义区域着色:ggplot(merged_df, aes(x = long, y = lat, group = group, fill = custom_region)) + geom_polygon(color = "white", linewidth = 0.2) + # 白色边框区分国家 theme_void() + # 去掉多余的坐标轴和背景 scale_fill_brewer(palette = "Set3", na.value = "lightgray") + # 给未匹配的国家设浅灰色 labs(title = "自定义区域世界地图(ggplot2版)", fill = "自定义区域") + theme(plot.title = element_text(hjust = 0.5)) # 标题居中
额外说明
- 不管用哪种方法,核心都是确保你的自定义区域数据和地图数据通过iso3代码正确匹配,所以只要你能给每个国家的iso3代码分配对应的自定义区域标签(不管是手动赋值还是从外部文件读取),就能轻松实现需求。
- 如果需要更精细的地图数据,也可以用
rnaturalearth包的ne_countries()函数获取,流程和上面完全一致,只需要把地图数据源替换即可。
内容的提问来源于stack exchange,提问作者user1778351
相关产品推荐
相关产品推荐

