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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:12:15