ggplot2地图为何错误识别输入的经纬度数据?
解决ggplot2地图添加点位变形的问题
出现这个问题的核心原因是:geom_sf图层使用的是地理坐标系,但geom_point/geom_text是基于笛卡尔坐标的图层,两者坐标系未统一,导致ggplot自动调整了地图范围和比例,进而出现点位偏移、地图变形的情况。
以下是两种可行的解决方法:
方法1:将点位数据转换为sf对象
把你的城市点位数据转换成sf格式,和底图ejru使用同一坐标系,让所有图层遵循统一的地理坐标规则:
library(sf) # 定义城市数据 city_data <- data.frame( city_name = c("Beit Hanina"), lat = c(31.8400), lon = c(35.2200) ) # 转换为sf对象,匹配底图的坐标系 city_sf <- st_as_sf(city_data, coords = c("lon", "lat"), crs = st_crs(ejru)) # 绘图 ggplot(data = ejru) + geom_sf() + geom_sf(data = city_sf, colour = "red") + geom_sf_text(data = city_sf, aes(label = city_name), nudge_y = 0.05, color = "darkblue")
方法2:显式指定coord_sf坐标系
保留原数据框格式,在绘图时强制添加coord_sf(),确保ggplot始终使用地理坐标系渲染所有图层:
ggplot(data = ejru) + geom_sf() + geom_point(data = city_data, mapping = aes(x = lon, y = lat), colour = "red") + geom_text(data = city_data, mapping = aes(x = lon, y = lat, label = city_name), nudge_y = 0.05, color = "darkblue") + coord_sf() # 强制统一坐标系
注意事项
- 调整
nudge_y的数值:原代码中nudge_y = 0.5在经纬度坐标系下过大,会把文本推离地图范围,改成0.05左右更合理。 - 提前确认底图
ejru的坐标系:可以用st_crs(ejru)查看,确保点位数据的坐标系和它一致。
内容的提问来源于stack exchange,提问作者Hannah Early
相关产品推荐
相关产品推荐

