You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 08:00:58