如何在Mollweide/Robinson投影下设置绘图背景透明但保留海洋白色
解决方案
问题核心在于默认海洋是panel.background的颜色,直接将其设为透明会丢失白色海洋效果。正确做法是手动绘制白色海洋背景多边形,再将面板和绘图区域背景设为透明,以此区分白色海洋与地图外的透明区域。
修改后的完整代码
library(pacman) p_load(terra, ggspatial, ggthemes, sf, tidyverse, viridis, cowplot) # 加载世界地图 wrld <- ne_countries() # 转换为Mollweide投影 wrld_moll <- project(terra::vect(wrld), "+proj=moll +lon_0=0 +x_0=0 +y_0=0") wlrd_sf <- st_as_sf(wrld_moll) # 创建Mollweide投影全范围多边形(作为海洋背景) moll_extent <- ext(wrld_moll) moll_poly <- as.polygons(moll_extent, crs = crs(wrld_moll)) %>% st_as_sf() # 绘图 p_final <- ggplot() + # 第一步:绘制白色海洋背景(覆盖整个面板范围) geom_sf(data = moll_poly, fill = "white", color = NA) + # 第二步:绘制陆地 geom_sf(data = wlrd_sf, fill = "grey90", col = "grey60", linewidth = 0.25) + # 使用theme_bw基础主题 theme_bw() + # 自定义主题:设置绘图背景透明,面板背景透明,保留边框 theme( axis.title = element_blank(), plot.background = element_rect(fill = "transparent", colour = NA), panel.background = element_rect(fill = "transparent", colour = NA), panel.border = element_rect(fill = NA, colour = "#238B45", linewidth = 2) ) p_final
关键说明
- 手动绘制海洋:通过
ext()获取Mollweide投影的边界范围,转换为多边形后填充白色,将该图层放在陆地图层之前,确保陆地显示在海洋上方。 - 背景透明设置:仅将
plot.background(整个绘图区域背景)和panel.background(面板内背景)设为透明,这样面板边框外的区域为透明,面板内的白色海洋由我们绘制的多边形提供,不会随背景变为透明。 - 保留面板边框:
panel.border设置为带颜色的边框,fill=NA确保边框内不填充颜色,让白色海洋多边形正常显示。
内容的提问来源于stack exchange,提问作者LT17
相关产品推荐
相关产品推荐

