如何解决ggarrange组合ggplot图表时标签被裁剪的问题?
解决ggarrange组合图表后标签被裁剪的问题
当用ggarrange组合ggplot图表时,常会遇到子图标签被裁剪的情况——单个图显示正常,组合后就裁掉了,试试下面几个解决方案:
方法1:给每个子图预留边距(最直接)
ggarrange在布局时会压缩子图的绘图区域,导致标签没地方放。给每个子图的theme里加plot.margin,在被裁剪的方向(比如你案例里的右侧)留出足够空间:
# 先调整每个子图的边距,右侧多留空白放标签 country_adj <- country + theme( axis.text.y = element_text(size = 10), axis.text.x = element_blank(), plot.margin = margin(5, 20, 5, 5) # 顺序:上、右、下、左,单位pt,可按需调整数值 ) position_adj <- position + theme( axis.text.y = element_text(size = 10), axis.text.x = element_blank(), plot.margin = margin(5, 20, 5, 5) ) fieldplot_adj <- fieldplot + theme( axis.text.y = element_text(size = 10), axis.text.x = element_blank(), plot.margin = margin(5, 20, 5, 5) ) methods_adj <- methods + scale_y_discrete(labels=c("OPMs", "iEEG", "MEG", "Scalp EEG")) + theme( axis.text.y = element_text(size = 10), axis.text.x = element_blank(), plot.margin = margin(5, 20, 5, 5) ) # 组合调整后的子图 ggarrange(country_adj, position_adj, fieldplot_adj, methods_adj, labels = c("A", "B", "C", "D"), ncol = 2, nrow = 2, align = 'h')
方法2:配合coord_cartesian(clip="off")+边距
如果单个子图用coord_cartesian(clip="off")能显示完整标签,但组合后还是被裁,那是因为ggarrange没给溢出的标签留空间。需要同时开启clip="off"并加大对应方向的边距:
country_adj <- country + coord_cartesian(clip = "off") + # 允许元素溢出绘图区域 theme( axis.text.y = element_text(size = 10), axis.text.x = element_blank(), plot.margin = margin(5, 30, 5, 5) # 右侧边距要更大,容纳溢出的标签 ) # 其他子图同理设置后再组合 ggarrange(country_adj, position_adj, fieldplot_adj, methods_adj, labels = c("A", "B", "C", "D"), ncol = 2, nrow = 2, align = 'h')
方法3:换用patchwork包(更省心)
ggarrange的布局逻辑对元素溢出不太友好,换成patchwork包组合图表,它会自动考虑子图元素的空间,默认就不容易裁标签:
library(patchwork) # 用+、|(列)、/(行)组合子图 (country + theme(axis.text.y = element_text(size=10), axis.text.x=element_blank())) | (position + theme(axis.text.y = element_text(size=10), axis.text.x=element_blank())) / (fieldplot + theme(axis.text.y = element_text(size=10), axis.text.x=element_blank())) | (methods + scale_y_discrete(labels=c("OPMs", "iEEG", "MEG", "Scalp EEG")) + theme(axis.text.y = element_text(size=10), axis.text.x=element_blank())) + plot_annotation(labels = c("A", "B", "C", "D")) # 添加子图标签
内容的提问来源于stack exchange,提问作者Vladimir Mikheev
相关产品推荐
相关产品推荐

