ggplot+geom_sf中调整X轴范围,居中显示含阿拉斯加东部的美国县地图
解决美国县边界地图居中且保留阿拉斯加完整区域的方案
核心思路:偏移阿拉斯加经度+调整绘图范围
针对阿拉斯加因跨180度经线导致部分区域显示在地图右侧的问题,我们可以通过修正阿拉斯加的坐标,把它东半球的部分拉回西半球范围,再配合coord_sf()设置合适的绘图边界,既保留所有区域,又让地图居中显示,同时完美兼容你的点图层。
具体代码实现
library(ggplot2) library(sf) # 加载并过滤掉海外领地数据 shp = st_read(dsn = "cb_2021_us_county_500k/cb_2021_us_county_500k.shp") shps_sf = shp[!(shp$STUSPS %in% c("PR","AS","GU","MP","VI")),] # 修正阿拉斯加的坐标:将东半球区域(经度>0)的经度减360,拉回西半球 ak_layer = shps_sf[shps_sf$STUSPS == "AK", ] # 提取坐标矩阵并修改经度 ak_coords = st_coordinates(ak_layer) ak_coords[ak_coords[, "X"] > 0, "X"] = ak_coords[ak_coords[, "X"] > 0, "X"] - 360 # 重新构建修正后的阿拉斯加sf对象 ak_fixed = st_sf( ak_layer[, names(ak_layer) != "geometry"], geometry = st_multipolygon(list(matrix(ak_coords, ncol = 2))) ) # 合并修正后的阿拉斯加与其他区域 shps_sf_fixed = rbind(shps_sf[shps_sf$STUSPS != "AK", ], ak_fixed) # 绘制居中的完整地图 ggplot() + geom_sf(data = shps_sf_fixed) + coord_sf(xlim = c(-180, -60), ylim = c(20, 75)) # 可根据需求微调范围
关键说明
- 坐标修正逻辑:阿拉斯加跨180度经线的部分原本属于西半球,但因经度计算方式显示为东半球(>0),减去360后就能回到西半球的合理经度范围(<0),避免被挤到地图右侧。
- 点图层兼容处理:如果你的点图层也存在阿拉斯加的东半球坐标,只需对这些点执行同样的操作——把经度>0的点的经度值减360,就能和修正后的地图图层完美叠加。
- 绘图范围调整:
xlim和ylim的参数可根据你想要的显示效果微调,确保美国本土和阿拉斯加都在视野内且布局美观。
内容的提问来源于stack exchange,提问作者Enrique Saldarriaga
相关产品推荐
相关产品推荐

