使用sf+ggplot绘制美国1900-1920年州界变化地图遇问题求助
解决美国历史州界变化区域可视化问题
问题原因
直接对分属两个时期的州要素集合调用st_difference会导致错误结果:因为每个1900年的州要素会被减去1920年所有州的要素,最终得到的是1900年每个州与1920年所有州不重叠的部分——这几乎涵盖了全部区域,因为州界调整后每个州的边界都存在细微差异,所以整个地图被蓝色覆盖。
修正方案
核心思路是先将两个时期的州界分别合并为单一的美国全域多边形,再通过对称差(st_sym_difference)提取两个时期的差异区域,最后叠加到1900年的底图上。
完整修正代码
library(tidyverse) library(sf) library(lubridate) # 读取shapefile states <- st_read("/US_HistStateTerr_Gen01_Shapefile/US_HistStateTerr_Gen01.shp") %>% rename_all(tolower) # 筛选1900年和1920年的有效州界 state_map_1900 <- states %>% filter(ymd(19000101) %within% interval(start_date, end_date)) state_map_1920 <- states %>% filter(ymd(19201231) %within% interval(start_date, end_date)) # 合并每个时期的所有州为单一多边形(确保CRS一致) us_1900_union <- state_map_1900 %>% st_union() %>% st_sf() # 转换为sf对象以便后续处理 us_1920_union <- state_map_1920 %>% st_union() %>% st_sf() # 计算两个时期的对称差异区域(即所有边界变化的部分) map_change <- st_sym_difference(us_1900_union, us_1920_union) # 绘图 ggplot() + # 1900年底图:白色填充,黑色边界 geom_sf(data = state_map_1900, fill = "white", color = "black", linewidth = 0.2) + # 差异区域:蓝色填充,无边界 geom_sf(data = map_change, fill = "blue", color = NA, alpha = 0.7) + labs(title = "1900-1920年美国州界变化区域", subtitle = "蓝色区域为边界调整部分") + theme_minimal() + theme(axis.text = element_blank(), axis.title = element_blank())
关键说明
st_union():将每个时期的所有州要素合并为一个整体,消除单个州要素的干扰,确保我们对比的是两个时期的全域边界。st_sym_difference():提取两个多边形之间所有不重叠的区域,这正是我们需要的边界变化部分(既包括1900年有但1920年消失的区域,也包括1920年新增的区域)。- 增加
alpha参数:让蓝色差异区域更柔和,避免完全覆盖底图的边界线。
内容的提问来源于stack exchange,提问作者匿名用户
相关产品推荐
相关产品推荐

