如何用R语言usmap包绘制美国国会选区(CD)地图?
用usmap绘制美国国会选区地图的实现方案
usmap包本身没有内置国会选区的绘图支持,但可以借助它的预设投影与布局,结合ggplot2的图层叠加功能,实现风格一致的国会选区地图,同时保留usmap的易用性。
1. 获取国会选区Shapefile
使用tigris包获取简化版的2023年国会选区空间数据:
library(tigris) # cb=TRUE表示获取简化边界,resolution='500k'控制精度,year指定选区版本 districts <- congressional_districts(cb = TRUE, resolution = '500k', year = 2023)
2. 匹配usmap的投影坐标
usmap默认采用Albers等面积投影,需将tigris获取的WGS84坐标系数据转换为对应投影:
library(usmap) library(sf) # 获取usmap使用的坐标参考系 usmap_crs <- get_crs() # 转换选区数据的坐标 districts_proj <- st_transform(districts, usmap_crs)
3. 绘制usmap风格的国会选区地图
可以通过两种方式实现:
方式一:叠加选区到usmap底图
先绘制usmap的州边界作为底图,再叠加选区图层,保持布局对齐:
library(ggplot2) # 绘制基础州边界(透明填充,仅保留边框) base_map <- plot_usmap(regions = "states", color = "gray80", fill = "transparent") # 叠加国会选区图层 base_map + geom_sf(data = districts_proj, fill = "#cce5ff", color = "white", size = 0.1, inherit.aes = FALSE) + theme(legend.position = "none")
方式二:直接用usmap主题绘制选区
如果不需要州底图,可直接基于转换后的选区数据绘图,应用usmap的主题样式:
ggplot() + geom_sf(data = districts_proj, fill = "#cce5ff", color = "white", size = 0.1) + theme_usmap() # 复用usmap的主题风格
4. 添加数据可视化示例
要展示选区的投票倾向、收入中位数等数据,只需将业务数据与选区空间数据合并,映射到填充颜色即可:
# 假设已有包含选区GEOID和对应数据的dataframe(如vote_data) districts_with_data <- merge(districts_proj, vote_data, by.x = "GEOID", by.y = "district_geoid") # 绘制带数据的选区地图 plot_usmap(regions = "states", color = "gray80", fill = "transparent") + geom_sf(data = districts_with_data, aes(fill = vote_lean), color = "white", size = 0.1, inherit.aes = FALSE) + scale_fill_gradient2(low = "darkblue", mid = "white", high = "darkred", midpoint = 0) + labs(title = "美国国会选区投票倾向分布", fill = "政党倾向") + theme(plot.title = element_text(hjust = 0.5))
注意事项
- 若选区数据包含海外领地(如波多黎各),可通过
dplyr::filter()筛选出美国本土选区,保持与usmap默认布局一致。 - 调整
size参数可控制选区边框粗细,fill参数自定义填充颜色,适配不同可视化需求。
内容的提问来源于stack exchange,提问作者Bill_Lussier
相关产品推荐
相关产品推荐

