R语言中如何使用sf与tmap包绘制多州/全美观县级行政地图
问题核心误区说明
你之前能成功读取的nc.shp是sf包内置的唯一演示样本,这个包本身没有附带其他州的县级矢量数据。
你使用的
system.file("shape/nc.shp", package="sf")是包内置文件的固定寻址路径,这个路径下仅存放北卡罗来纳州的演示shp文件,直接把路径里的文件名替换成sc.shp、va.shp,既找不到对应实体文件,读取到的空对象也没有原数据自带的AREA、NAME等字段,才会触发Error: Fill argument neither colors nor valid variable name(s)报错。
可直接在R环境获取全美县级数据的方案
所有方案都不需要手动下载shapefile,写完代码即可直接获取可绘图的sf格式矢量数据:
- 用
tigris包:对接美国人口普查局官方开放数据接口,可按需拉取指定州/全美范围的县级矢量,支持简化边界版本,文件体积小、绘图加载快。比如拉取单州数据时,只要在参数里指定对应州的两位缩写即可,多州只需传入缩写向量。 - 用
albersusa包:内置已经适配全美地图常用等积圆锥投影的县级、州级矢量数据,拉取后无需手动调整投影,绘制全国范围图时视觉效果更协调。 - 用
maps包内置的地理数据:通过map_data()函数拉取的县级数据为表格格式,简单转成sf对象即可适配tmap,适合轻量化快速绘图场景。
适配你现有tmap绘图流程的可复现代码
整体绘图逻辑完全保留你之前的代码结构,仅调整数据获取、对应字段匹配的部分即可运行:
library(tmap) library(tigris) library(sf) library(tidyverse) options(scipen = 999) # 拉取指定多州的县级数据,替换成你需要的州缩写即可,单州、全美都支持 multi_state_county <- counties( state = c("NC", "SC", "VA"), cb = TRUE, # 使用简化边界版本,加载更快 progress_bar = FALSE ) # 按照你的分类逻辑生成Code字段,注意对应匹配数据自带的面积列、名称列 county_plot_data <- multi_state_county %>% mutate(Code = case_when( ALAND <= 200000000 ~ "Label 1", # 面积阈值可根据你的分类标准校准,和原演示数据的AREA字段做换算即可 TRUE ~ "Label 2" )) # 绘图逻辑和你之前的代码完全一致 tm_shape(county_plot_data)+ tm_polygons("Code", id = "NAMELSAD", palette = "Blues") # id列替换为数据自带的县级名称字段即可 tmap_mode("view") tmap_last()
分区/多州展示的实用技巧
- 拉取跨区域多州数据时,直接把对应分区的州缩写传入
state参数即可,数据自带统一投影,拼接后不会出现边界错位问题。 - 需要按南北/东西分区分面展示时,只需给数据新增一列标记所属区域,之后在tmap绘图链中添加
tm_facets(by = "分区列名")即可自动生成对应分面图。 - 绘制全美范围地图时,可直接调用
counties(cb = TRUE)拉取全部县级数据,无需逐州合并。
内容的提问来源于stack exchange,提问作者The Rookie
相关产品推荐
相关产品推荐

