在R中使用ggplot与ggarrange排列带刻度中断的多图时的问题
解决ggarrange与ggbreak刻度中断不兼容的问题
问题核心在于ggarrange(来自ggpubr包)对ggbreak生成的特殊ggplot对象支持不足——ggbreak通过修改ggplot底层绘图逻辑实现刻度中断,而ggarrange的拼接机制无法保留这一修改,导致刻度中断消失。这里提供两个简单的解决办法:
方法一:用patchwork包替代ggarrange
patchwork是专门为ggplot对象拼接设计的工具,对ggbreak这类修改过的ggplot对象兼容性更好,用法也更简洁:
library(ggplot2) library(ggbreak) library(patchwork) # 加载patchwork包 vec1 <- c(1:50, 500) data <- data.frame(vec1) vec2 <- c(10:60) data2 <- data.frame(vec2) # 生成带刻度中断的图 a <- ggplot() + geom_boxplot(data=data, aes(x="1", y=vec1)) + scale_y_break(c(100, 550)) + theme(legend.position="none") # 生成普通图 b <- ggplot() + geom_boxplot(data=data2, aes(x="1", y=vec2)) + theme(legend.position="none") # 拼接图并添加标签 a | b + plot_annotation(tag_levels = "A")
运行后就能看到两个图并排,且图A的刻度中断完整保留。
方法二:保留ggarrange,转换为gtable后拼接
如果不想更换包,可以把ggbreak生成的图转换为gtable对象,再用grid包的拼接工具实现:
library(ggplot2) library(ggbreak) library(ggpubr) library(grid) # 加载grid包 vec1 <- c(1:50, 500) data <- data.frame(vec1) vec2 <- c(10:60) data2 <- data.frame(vec2) a <- ggplot() + geom_boxplot(data=data, aes(x="1", y=vec1)) + scale_y_break(c(100, 550)) + theme(legend.position="none") b <- ggplot() + geom_boxplot(data=data2, aes(x="1", y=vec2)) + theme(legend.position="none") # 将图a转换为gtable对象 a_grob <- ggplotGrob(a) # 用grid.arrange拼接,效果和ggarrange类似 grid.arrange(a_grob, b, labels = c("A", "B"), ncol = 2)
这种方式也能保留图A的刻度中断效果。
内容的提问来源于stack exchange,提问作者Amlin
相关产品推荐
相关产品推荐

