在R中按纬度分区着色绘制世界地图的实现方案问询
按纬度带为世界地图着色的可行方案
核心思路
放弃依赖rworldmap中绑定国家的函数,改用sf+ggplot2组合直接处理地理多边形数据:先给每个国家判定所属纬度带,再关联你的Value数据完成可视化,完全绕开国家分类的限制。
具体实现步骤
1. 安装并加载所需包
需要用到rnaturalearth获取标准世界地理数据,sf处理空间对象,ggplot2绘图,dplyr做数据清洗:
install.packages(c("rnaturalearth", "sf", "ggplot2", "dplyr")) library(rnaturalearth) library(sf) library(ggplot2) library(dplyr)
2. 准备你的示例数据
替换成你实际的数据集即可,这里用模拟数据演示:
# 示例数据:国家名称 + 对应Value值 user_data <- data.frame( Country = c("China", "Brazil", "United States", "Australia", "South Africa"), Value = c(15, 22, 18, 25, 12) )
3. 获取地理数据并添加纬度带分类
用ne_countries()获取带属性的国家空间数据,通过计算国家中心点纬度来判定所属纬度带:
# 获取世界国家的sf格式空间数据 world_sf <- ne_countries(returnclass = "sf") # 计算每个国家的中心点纬度,划分纬度带 world_sf <- world_sf %>% mutate( # 提取多边形中心点的纬度值 center_lat = st_coordinates(st_centroid(geometry))[,2], # 按回归线划分纬度带 lat_belt = case_when( center_lat > 23.5 ~ "北温带", abs(center_lat) <= 23.5 ~ "热带", center_lat < -23.5 ~ "南温带" ) )
注:如果觉得中心点判定不够准确,也可以提取国家多边形的纬度范围(比如
st_bbox(geometry)[["ymin"]]和ymax),再根据范围调整判定逻辑(比如只要有区域覆盖热带就归为热带)。
4. 关联你的Value数据
按国家名称合并地理数据和你的业务数据,注意统一名称拼写,避免匹配失败:
# 按国家名称合并(ne_countries的国家名称列是`name`) world_data <- world_sf %>% left_join(user_data, by = c("name" = "Country"))
如果名称匹配有问题,建议改用ISO代码(ne_countries提供iso_a3列)匹配,准确率更高。
5. 绘制最终地图
用ggplot2的geom_sf实现按纬度带区分、Value值控制颜色深浅的地图:
ggplot(world_data) + geom_sf(aes(fill = Value, color = lat_belt), linewidth = 0.2) + # 设置Value值的颜色渐变方案 scale_fill_viridis_c(option = "plasma", na.value = "gray80") + # 设置不同纬度带的边界颜色 scale_color_manual(values = c("北温带" = "darkblue", "热带" = "darkorange", "南温带" = "darkgreen")) + # 添加标题和图例标签 labs(title = "世界地图:按纬度带划分的Value分布", fill = "Value值", color = "纬度带") + # 优化主题样式 theme_minimal() + theme( plot.title = element_text(hjust = 0.5, size = 14), legend.position = "bottom" )
额外调整方向
如果需要严格按纬度区域(而非国家归属)着色,可以直接创建三个横向纬度带的多边形图层,和国家图层叠加显示,但这种方式会覆盖国家边界,适合只展示纬度区域分布的场景。
内容的提问来源于stack exchange,提问作者jeff
相关产品推荐
相关产品推荐

