如何在ggplot2中让panel.grid置于前景,避免被地图图层遮挡?
解决ggplot2中地图网格线被图层遮挡的问题
默认情况下,ggplot2的panel.grid.major/minor属于面板背景层,会被后续绘制的geom_sf地图图层覆盖,导致网格线被遮挡。要让网格线显示在地图前景,需要手动绘制经纬线图层并将其放在地图图层之后,具体有两种常用方法:
方法1:使用annotation_graticule(推荐)
annotation_graticule是专门用于绘制经纬线的注解图层,直接放在geom_sf之后即可叠加在地图上方:
library(rnaturalearth) library(ggplot2) library(sf) ggplot(ne_countries(scale = "medium", continent = NULL, returnclass = "sf")) + geom_sf() + # 添加经纬线注解,放在geom_sf之后实现前景显示 annotation_graticule(colour = "red", linewidth = 0.5) + coord_sf(xlim=c(2600000, 7300000), ylim=c(5450000, 1000000), crs = st_crs(3035)) + theme(panel.background = element_rect(fill = "white"), # 关闭默认网格线,避免重复 panel.grid.major = element_blank(), panel.grid.minor = element_blank())
方法2:手动生成经纬线SF对象
通过st_graticule生成自定义经纬线的SF数据,再用geom_sf绘制在地图上方:
library(rnaturalearth) library(ggplot2) library(sf) # 生成经纬线数据,先定义WGS84坐标系下的经纬度间隔,再转换为地图使用的CRS graticule_lines <- st_graticule( lat = seq(30, 70, 10), # 纬度间隔,可根据需求调整 lon = seq(-10, 40, 10), # 经度间隔,可根据需求调整 crs = st_crs(4326) ) %>% st_transform(st_crs(3035)) ggplot() + geom_sf(data = ne_countries(scale = "medium", continent = NULL, returnclass = "sf")) + # 绘制经纬线,放在地图图层之后 geom_sf(data = graticule_lines, colour = "red", linewidth = 0.5) + coord_sf(xlim=c(2600000, 7300000), ylim=c(5450000, 1000000), crs = st_crs(3035)) + theme(panel.background = element_rect(fill = "white"), panel.grid.major = element_blank(), panel.grid.minor = element_blank())
关键说明
- 两种方法都需要关闭默认的
panel.grid,避免重复绘制网格线。 - 图层顺序是核心:后添加的图层会叠加在之前的图层上方,所以只要确保经纬线图层在
geom_sf之后,就能实现前景显示。
内容的提问来源于stack exchange,提问作者Luigi
相关产品推荐
相关产品推荐

