合并两个空间对象ID,创建加泰罗尼亚市镇人口分级统计图
制作可复现的加泰罗尼亚市镇人口分级统计图
嘿,结合你已经完成的导入和坐标系匹配步骤,我来帮你把后续的流程补全,确保整个分析完全可复现:
一、回顾已完成的基础步骤
你已经搞定了数据下载和初步导入,这里把完整的导入+坐标系对齐代码补全:
# 提前安装依赖包:install.packages(c("rgdal", "sf", "ggplot2", "tmap")) library(rgdal) # 导入人口数据(替换"location"为你的文件实际存放路径) catapop <- readOGR("location", "rp2016_qtree_level2_ofus_allvar") # 导入市镇边界数据(替换"boundary_path"为你的边界文件路径) cata_bound <- readOGR("boundary_path", "bseccenv10sh1f1_2002a2016_0") # 统一坐标系(用人口数据的CRS对齐边界数据) cata_bound <- spTransform(cata_bound, CRS(proj4string(catapop)))
二、关联人口数据与边界数据
这一步是核心,需要找到两个数据集的共同标识符(比如市镇编码,通常是类似COD_MUNICIPI的字段)。先查看两个数据集的字段名确认:
# 查看人口数据的字段列表 names(catapop@data) # 查看边界数据的字段列表 names(cata_bound@data)
假设共同匹配字段是COD_MUNICIPI,执行数据合并:
# 合并空间数据(保留所有边界,匹配对应人口数据) cata_combined <- merge(cata_bound, catapop@data, by = "COD_MUNICIPI", all.x = TRUE) # 检查是否有缺失的人口数据(可选但重要) sum(is.na(cata_combined$POPULATION)) # 替换成你实际的人口数值字段名
三、绘制分级统计图
推荐两种主流方法,选你顺手的就行:
方法1:用ggplot2 + sf(现代空间绘图首选)
把sp对象转成sf格式,绘图灵活性更高:
library(sf) library(ggplot2) # 将合并后的sp对象转换为sf格式 cata_sf <- st_as_sf(cata_combined) # 绘制分级填充地图 ggplot(cata_sf) + # 绘制市镇多边形,填充色绑定人口数据 geom_sf(aes(fill = POPULATION), color = "#ffffff", size = 0.1) + # 选用色盲友好的viridis配色 scale_fill_viridis_c(option = "magma", name = "2016年人口数", breaks = scales::breaks_pretty(n = 5)) + # 添加标题和数据来源标注 labs(title = "加泰罗尼亚市镇人口分布(2016)", subtitle = "分级统计图", caption = "数据来源:IDESCAT & ICC") + # 去除多余的坐标轴和网格,优化视觉效果 theme_minimal() + theme( axis.text = element_blank(), axis.title = element_blank(), panel.grid = element_blank(), plot.title = element_text(hjust = 0.5), plot.subtitle = element_text(hjust = 0.5) )
方法2:用tmap(快速绘制专业地图)
tmap专门针对空间数据设计,代码更简洁高效:
library(tmap) library(RColorBrewer) # 设置分级配色方案 pop_pal <- brewer.pal(6, "YlGnBu") # 绘制地图 tm_shape(cata_combined) + tm_polygons("POPULATION", palette = pop_pal, title = "2016年人口数", border.col = "white", border.lwd = 0.1) + tm_layout( title = "加泰罗尼亚市镇人口分布", title.position = c("center", "top"), legend.position = c("right", "bottom"), frame = FALSE, inner.margins = c(0.02, 0.02, 0.02, 0.02) )
四、常见坑点排查
- 合并后缺失值多:检查两个数据集的市镇编码是否完全匹配,比如是否有大小写差异、多余空格,必要时用
trimws()清理字符串字段 - 坐标系不匹配报错:用
proj4string(catapop)和proj4string(cata_bound)确认CRS字符串完全一致,若不一致手动指定正确的CRS - 绘图时边界显示不全:检查Shapefile是否完整导入,确保所有关联文件(.shp/.shx/.dbf等)都在同一目录下
内容的提问来源于stack exchange,提问作者delcast
相关产品推荐
相关产品推荐

