使用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
相关产品推荐
相关产品推荐

