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

使用grid.arrange/ggarrange组合图像时边距过大问题求助

问题分析与解决方案

问题原因

你遇到的图片间距过大问题,核心原因是**coord_sf()强制维持地图的固定纵横比**。地理空间地图需要保持正确的经纬度比例以避免变形,coord_sf()会自动锁定子图的宽高比,此时即便调整plot.margin,子图的整体尺寸仍受这个固定比例限制,多余空白无法被压缩,最终导致组合时子图间出现过大间距。

另外你设置的plot.margin使用了负数左右边距,但由于纵横比的锁定,ggplot会优先保证地图比例,这类无效的边距调整会被忽略。

解决步骤

1. 优化单个子图的空白空间

在coord_sf()中添加expand = FALSE,去掉坐标轴外的默认空白;无需手动设置aspect.ratio,coord_sf会自动计算适配地图的比例。

2. 组合时精准控制间距

利用组合函数的专属参数压缩间距:

  • grid.arrange():添加padding = unit(0, "mm")减少子图间内边距;
  • ggarrange():用align = "hv"同时对齐横竖方向,配合widths = c(1,1)、heights = c(1,1)保证尺寸一致,再设置padding = 0;
  • plot_grid():使用align = "hv"、padding = unit(0, "mm"),rel_widths和rel_heights设为等比例。

修正后的代码示例

library("sf")
library("sp")
library("ggplot2")
library("gridExtra")
library("cowplot")
library("ggpubr")

# 读取并转换数据(假设已加载data)
coordinates(data) <- ~Lon + Lat
proj4string(data) <- CRS("+proj=longlat +datum=WGS84")
data <- st_as_sf(data)

t1 <- ggplot() +
  geom_sf(data = data, alpha= 0.8) +
  coord_sf(xlim = c(120, 122), ylim = c(22, 25.2), expand = FALSE) + # 关键:移除轴外空白
  labs(title = "Jan") +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5),
    panel.grid = element_blank(),
    axis.text.x = element_blank(),
    axis.text.y = element_blank(),
    legend.position = "none",
    plot.background = element_rect(color = "blue"),
    panel.border = element_rect(color = "red", fill = "NA"),
    plot.margin = unit(c(0.1, 0.1, 0.1, 0.1), "mm") # 改用小正数边距,避免负数无效
  )

# 三种优化后的组合方式
grid.arrange(t1, t1, t1, t1, ncol = 2, padding = unit(0, "mm"))
plot_grid(t1, t1, t1, t1, ncol = 2, align = "hv", padding = unit(0, "mm"))
ggarrange(t1, t1, t1, t1, ncol = 2, align = "hv", padding = 0)

额外说明

如果仍有少量间距,可微调plot.margin的数值,但避免使用极端负数(受纵横比限制无法生效)。同时确保所有子图的xlim和ylim完全一致,保证组合时尺寸匹配度更高,避免因子图尺寸差异导致间距不均。

内容的提问来源于stack exchange,提问作者sinyu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:48:13