如何用geom_sf()去除地球另一侧的多余经纬网格线?
解决Chambord投影下多余网格线的问题
针对你用Chambord投影绘制非洲地图时出现的地球另一侧多余网格线,有两种实用方法可以只隐藏这些多余线条:
方法1:通过coord_sf限制显示范围
直接在ggplot中添加coord_sf(),设置匹配非洲区域的投影坐标范围,就能自动过滤掉外侧的多余网格线。你可以先获取转换后非洲对象的边界,再适当扩大范围避免裁剪地图边缘:
library(tmap) library(sf) library(dplyr) library(ggplot2) world.sf <- World # from tmap africa_proj <- world.sf %>% filter(continent == "Africa") %>% st_transform("+proj=chamb +lat_1=22 +lon_1=0 +lat_2=22 +lon_2=45 +lat_3=-22 +lon_3=22.5 +datum=WGS84 +type=crs") # 获取投影后的边界范围 bbox <- st_bbox(africa_proj) # 绘图时限制显示范围 ggplot(africa_proj) + geom_sf(aes(fill = economy)) + coord_sf(xlim = c(bbox[1] - 1e6, bbox[3] + 1e6), ylim = c(bbox[2] - 1e6, bbox[4] + 1e6))
方法2:自定义裁剪后的网格线
先生成全局经纬网格,再裁剪到非洲的边界范围内,替换默认的网格线,能更精准控制网格显示:
# 生成全局经纬网格并转换到目标投影 graticule <- st_graticule() %>% st_transform(st_crs(africa_proj)) # 裁剪网格到非洲区域的边界 graticule_cropped <- st_intersection(graticule, st_union(africa_proj)) # 绘图时使用自定义裁剪后的网格 ggplot(africa_proj) + geom_sf(aes(fill = economy)) + geom_sf(data = graticule_cropped, color = "gray50", linetype = "dashed") + coord_sf(expand = FALSE)
这两种方法都能只保留非洲区域对应的网格线,隐藏地球另一侧的多余线条。第一种操作更简便,第二种对网格的显示范围控制更精准。
内容的提问来源于stack exchange,提问作者Mark R
相关产品推荐
相关产品推荐

