如何在R的ggplot中用WGS84生成等经纬度网格?
问题描述
本人熟悉R与ArcGIS Pro,希望在R中使用ggplot结合WGS84绘制地图。在ArcGIS Pro中缩放至德国区域时可获得等经纬度网格,但在R的ggplot2中使用WGS84却无法实现该效果,以下是尝试的代码及效果对比图。
尝试代码
library("ggplot2") library("rnaturalearth") library("rnaturalearthdata") library("terra") library("sf") world <- ne_countries(scale = "medium", returnclass = "sf") world_projected <- st_transform(world, crs("epsg:4326")) ggplot(data = world_projected) + geom_sf(fill = "transparent") + theme( panel.grid.major = element_line(colour = alpha("black", 0.1), linewidth=1, linetype = 1) ) + coord_sf(xlim = c(5, 16), ylim = c(46, 56), default_crs = crs("epsg:4326"))
效果对比
- ArcGIS Pro效果:

- R ggplot2效果:

解决方案
问题根源在于ggplot2默认的网格生成逻辑:使用WGS84(EPSG:4326)时,panel.grid.major会根据绘图区域像素自动调整网格密度,不会严格按照固定经纬度间隔生成。要实现ArcGIS式的等间隔网格,需手动指定网格线位置。
修改后的代码如下:
library("ggplot2") library("rnaturalearth") library("rnaturalearthdata") library("sf") # 获取地图数据并转换为WGS84 world <- ne_countries(scale = "medium", returnclass = "sf") |> st_transform(crs = "EPSG:4326") # 定义德国区域经纬度范围 lon_range <- c(5, 16) lat_range <- c(46, 56) # 生成等间隔经纬度网格(可调整by参数改变间隔) lon_grid <- seq(lon_range[1], lon_range[2], by = 2) lat_grid <- seq(lat_range[1], lat_range[2], by = 2) ggplot(data = world) + geom_sf(fill = "transparent") + # 添加手动网格线 geom_hline(yintercept = lat_grid, colour = alpha("black", 0.1), linewidth = 1) + geom_vline(xintercept = lon_grid, colour = alpha("black", 0.1), linewidth = 1) + # 锁定坐标范围与CRS coord_sf(xlim = lon_range, ylim = lat_range, crs = "EPSG:4326") + # 关闭默认自动网格 theme( panel.grid.major = element_blank(), panel.grid.minor = element_blank() )
代码说明
- 手动生成网格:通过
seq()创建固定间隔的经纬度值,by参数可按需调整(比如改成1度); - 替换默认网格:用
geom_hline()和geom_vline()添加自定义网格,同时关闭ggplot默认的自动网格; - 保持CRS一致:全程使用EPSG:4326,避免坐标转换导致的网格偏移。
内容的提问来源于stack exchange,提问作者Pallav
相关产品推荐
相关产品推荐

