R语言如何基于Shapefile关联属性绘制choropleth分级统计地图
问题根因
你当前的代码使用旧版sp包的SpatialPolygonsDataFrame结构存储空间数据,直接修改对象的@data槽完成表连接的方式,虽然能让基础绘图函数(比如你用的barplot)正常读取属性,但tmap等空间可视化包识别这类手动修改过槽位的sp对象时,很容易出现字段索引不匹配、关联字段无法识别的问题;另外你已经加载了sf包但没有使用更稳定的简单要素格式处理数据,也是字段调用失败的核心原因。
修复方案
不要直接操作sp对象的@data槽,直接将空间数据转换为sf格式处理——sf对象本质是带空间几何列的普通数据框,和dplyr等数据处理包兼容性更好,连表操作不会出现空间信息和属性不匹配的问题,修复后的可运行代码如下:
library(sf) library(tmap) library(dplyr) tmap_mode("plot") setwd("C:/Users/ITLINK/Desktop/unigis/environmental monitooring") # 用sf的st_read替代旧的readOGR读入shapefile Bagmati_sf <- st_read("BagmatiProvinance.shp") wasteDEPOSIT <- read.csv("solid_waste.csv") # 直接对sf对象做左连接,无需操作底层槽位 Bagmati_sf <- left_join(Bagmati_sf, wasteDEPOSIT, by = c('DISTRICT' = 'dist_name')) # 校验属性表 head(Bagmati_sf) # 原有柱状图可正常运行 barplot(Bagmati_sf$WSHED, ylim=c(0,10000),names = Bagmati_sf$DISTRICT, xlab="DISTRICT", ylab="Waste deposit", main="waste deposit in Bagmati provinance") # 绘制分级统计(choropleth)地图 tm_shape(Bagmati_sf) + tm_polygons( col = "WSHED", title = "Waste deposit", palette = "YlOrRd", style = "quantile" # 可根据需求替换为equal、jenks等分级方式 ) + tm_layout(legend.outside = TRUE)
补充说明
- 如果必须保留sp对象格式,连表后需要逐行校验
@data的行顺序和空间要素顺序完全一致,一旦顺序错位不仅会出现字段识别问题,还会导致属性和行政区匹配错误,不推荐手动修改@data槽的操作方式 - 如果运行时提示找不到
WSHED字段,先运行names(Bagmati_sf)打印所有字段名,排查是否存在字段名带隐藏空格、编码异常导致的名称不匹配问题
内容的提问来源于stack exchange,提问作者Bibek
相关产品推荐
相关产品推荐

