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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 18:27:15