如何修复R语言绘制美国2D六边形地图时的六边形变形问题
美国六边形地图变形问题的解决方案
核心原因
六边形变形的直接原因是地理投影的尺度畸变:在常用的经纬度投影(如WGS84,EPSG:4326)中,高纬度区域(如阿拉斯加)的东西方向距离会被过度拉伸,导致生成的六边形形态被扭曲。所有基于未校正投影生成的网格都会出现这个问题。
解决步骤
1. 切换到等面积投影
选择适合美国区域的等面积投影,保证所有区域的尺度一致,推荐使用Albers Equal Area Conic(EPSG:5070),该投影专门针对北美区域设计,能有效避免尺度畸变。
2. 修正阿拉斯加、夏威夷的位置(可选)
标准美国地图会将阿拉斯加、夏威夷平移到右下角便于展示,调整时需保持坐标缩放比例一致,避免破坏六边形形态。
3. 修正后代码示例
# 加载所需包 library(sf) library(ggplot2) library(tigris) # 获取美国本土+阿拉斯加+夏威夷数据(替换为你自己的shp/geojson也可) us_states <- states(cb = TRUE) %>% filter(!STUSPS %in% c("PR", "VI", "GU", "AS", "MP")) # 转换到Albers等面积投影 us_albers <- st_transform(us_states, crs = 5070) # 调整阿拉斯加:缩放至原大小的30%,并平移到指定位置 alaska <- us_albers %>% filter(STUSPS == "AK") alaska_adjusted <- st_scale(alaska, scale = c(0.3, 0.3)) %>% st_translate(x = -2000000, y = -2500000) # 调整夏威夷:平移到指定位置 hawaii <- us_albers %>% filter(STUSPS == "HI") hawaii_adjusted <- st_translate(hawaii, x = 1500000, y = -1500000) # 合并调整后的所有州数据 us_final <- us_albers %>% filter(!STUSPS %in% c("AK", "HI")) %>% rbind(alaska_adjusted, hawaii_adjusted) # 生成统一形态的六边形网格(cell_size单位为米,可按需调整) hex_grid <- st_make_grid(us_final, cellsize = 100000, square = FALSE) %>% st_intersection(us_final) # 绘制地图 ggplot() + geom_sf(data = hex_grid, fill = "#4292c6", color = "white", linewidth = 0.2) + theme_minimal() + theme(axis.text = element_blank(), axis.title = element_blank())
关键注意事项
- 必须先转换投影,再生成六边形网格:如果先在经纬度投影下生成网格再转换,畸变已经产生,无法修复。
- 自定义shp/geojson数据需确保坐标系识别正确,若数据无CRS信息,需先用
st_crs(us_data) <- 4326指定原始投影后再转换。
内容的提问来源于stack exchange,提问作者user25722924
相关产品推荐
相关产品推荐

