因经度符号差异导致ggplot地图无法对齐的技术问询
解决ggplot叠加地图错位及数据行被移除的问题
问题背景
使用R的ggplot绘制两幅埃德蒙顿地图时出现异常:
- 从shp文件读取的区域地图:经度为带W标识的正数,通过sf包加载
- 基于开放税收数据生成的
stat_summary_2d热力图:经度为负数
叠加时触发「所有数据行被移除」警告,两幅图完全错位。尝试过设置CRS为4269、取经度绝对值,均未解决问题。
核心原因
两个数据源的坐标参考系(CRS)不匹配:
- shp文件大概率采用投影坐标系(比如埃德蒙顿常用的UTM Zone 10N,EPSG:32610),单位为米,因此经度显示为大正数
- 开放税收数据采用地理坐标系(WGS84,EPSG:4326),单位为度,西经以负数表示
解决方案步骤
1. 确认shp文件的CRS
先查看加载后的shp数据的坐标系统:
library(sf) # 查看yegmap的CRS信息 st_crs(yegmap)
记录返回的EPSG代码(例如埃德蒙顿区域常见值为32610)。
2. 将开放税收数据转换为匹配的CRS
把经纬度数据转换为sf对象,先指定原始CRS为WGS84,再转换到与shp一致的投影CRS:
library(dplyr) # 将AssessmentData转换为sf对象,指定原始CRS为WGS84(EPSG:4326) AssessmentData_sf <- st_as_sf(AssessmentData, coords = c("longitude", "latitude"), crs = 4326) # 转换为与yegmap一致的CRS(替换为你实际查到的EPSG代码) AssessmentData_sf <- st_transform(AssessmentData_sf, crs = st_crs(yegmap)) # 提取转换后的坐标到普通数据框,适配stat_summary_2d AssessmentData_transformed <- AssessmentData_sf %>% mutate( x = st_coordinates(.)[,1], y = st_coordinates(.)[,2] ) %>% st_drop_geometry() # 移除sf几何属性,变回普通数据框
3. 重新绘制并叠加地图
使用转换后的坐标数据绘制热力图,再叠加shp地图,避免手动设置坐标范围:
# 叠加地图的正确代码 final_plot <- ggplot() + # 绘制热力图,使用转换后的x、y坐标 stat_summary_2d(data = AssessmentData_transformed, mapping = aes(x = x, y = y, z = TaxGenerated), bins = 500, fun = function(z) sum(z)) + scale_fill_gradient(low = "brown", high = "yellow") + # 注意用scale_fill而非scale_colour,stat_summary_2d生成填充色块 # 叠加shp区域地图,设置fill为NA避免覆盖热力图 geom_sf(data = yegmap, fill = NA, color = "black") + labs(title = "埃德蒙顿税收热力图叠加区域边界") print(final_plot)
关键注意点
- 原代码中
scale_colour_gradient为错误用法,stat_summary_2d生成的是填充色块,需改用scale_fill_gradient - 不要手动设置
xlim/ylim,让ggplot自动匹配两个图层的坐标范围 - 转换CRS时必须确保原始数据的CRS指定正确(开放经纬度数据几乎都采用WGS84,EPSG:4326)
内容的提问来源于stack exchange,提问作者Wild Turkey Sandwich
相关产品推荐
相关产品推荐

