You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 23:12:38