美国ZIP区域统计地图绘制异常,求解决方法
你用usa::zipcodes拿到的是每个ZIP的单点经纬度(区域中心点),但geom_polygon是用来绘制多边形区域的,把零散的点直接喂给它,R会把所有点按顺序强行连接,自然会画出混乱的图形——这就是问题的核心原因。
下面给你对应两种需求的解决方案:
方案1:绘制ZIP区域填充地图(按统计值着色)
美国没有官方的"ZIP区域多边形"数据,常用替代是ZCTA(ZIP Code Tabulation Areas),这是人口普查局划分的近似ZIP的统计区域。用tigris包可以直接获取该数据:
- 安装并加载依赖包:
install.packages(c("tigris", "dplyr", "ggplot2", "ggthemes")) library(tigris) library(dplyr) library(ggplot2) library(ggthemes)
- 获取ZCTA多边形数据并与你的数据集关联(注意ZIP码要保持字符串格式,避免前导零丢失):
# 获取简化版美国本土ZCTA数据,减少计算压力 zcta_data <- zctas(cb = TRUE, year = 2020) %>% mutate(ZIPCODE = as.character(GEOID20)) # 假设你的数据集叫my_data,包含zipcode和my_stat列 to_map <- zcta_data %>% left_join(my_data, by = c("ZIPCODE" = "zipcode"))
- 用
geom_sf绘制填充地图(sf对象自带多边形边界信息,比geom_polygon更稳定):
ggplot(to_map) + geom_sf(aes(fill = my_stat), color = "black", size = 0.09) + scale_fill_gradient(low = "yellow", high = "dark green", na.value = "gray90") + ggthemes::theme_map() + theme(legend.background = element_rect(fill = alpha("white", 0.5))) + coord_sf(crs = 4326) # 采用标准WGS84坐标系统
方案2:用圆圈展示密度/统计值(适合中心点数据)
如果只是想展示每个ZIP区域的统计值或密度,直接用geom_point即可,不用纠结多边形:
修改你原来的代码,替换图层并调整参数:
to_map %>% ggplot(aes(x = long, y = lat, color = my_stat, size = my_stat)) + geom_point(alpha = 0.6) + # 增加透明度避免点重叠 scale_color_gradient(low = "yellow", high = "dark green") + scale_size_continuous(range = c(1, 5)) # 自定义点的大小范围 ggthemes::theme_map() + theme(legend.background = element_rect(fill = alpha("white", 0.5))) + coord_fixed() # 保持地图比例正确
额外注意:关联数据时,确保你的zipcode列和zipcodes返回的zip列格式一致——比如带前导零的ZIP码要转为字符串,否则数字格式会丢失前导零,导致关联失败。
内容的提问来源于stack exchange,提问作者Abaco
相关产品推荐
相关产品推荐

