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

如何用R的ggplot2创建带轴断裂的图?解决ggbreak相关兼容问题

针对ggbreak组合图断裂消失及注释问题的解决方案

1. 用patchwork替代ggarrange组合带断裂的图

ggpubr包的ggarrange对ggbreak生成的特殊图层兼容性差,组合后会丢失轴断裂效果。换成patchwork包(ggplot2生态的专用图组合工具)即可解决:

首先加载依赖包:

library(ggplot2)
library(ggbreak)
library(patchwork)

构造含异常值的示例数据:

set.seed(123)
df1 <- data.frame(x = 1:10, y = rnorm(10, 5, 1))
df1$y[10] <- 20 # 插入异常值
df2 <- data.frame(x = 1:10, y = rnorm(10, 8, 2))
df2$y[5] <- 25

绘制两个带Y轴断裂的独立图:

p1 <- ggplot(df1, aes(x, y)) +
  geom_point() +
  scale_y_break(c(8, 18), scales = 1) + # 设置断裂区间,scales控制上下部分刻度比例
  theme_bw()

p2 <- ggplot(df2, aes(x, y)) +
  geom_point(color = "red") +
  scale_y_break(c(12, 22), scales = 1) +
  theme_bw()

用patchwork组合,保留轴断裂效果:

p1 + p2 + plot_layout(ncol = 2)

2. 解决绘图区域外添加注释的问题

ggbreak默认会调整绘图布局,常规annotate()无法在区域外生效,可通过以下两种方式解决:

方法一:用annotation_custom结合grid对象添加注释

通过grid包创建文本对象,关闭绘图裁剪限制并调整边距,让注释显示在区域外:

library(grid)

# 创建注释文本的grid对象
text_note <- textGrob("异常值标记", x = 0.05, y = 1.1, gp = gpar(col = "blue", fontsize = 12))

p1_annotated <- p1 +
  annotation_custom(text_note) +
  coord_cartesian(clip = "off") + # 关闭裁剪,允许区域外元素显示
  theme(plot.margin = margin(50, 20, 20, 20)) # 调整顶部边距,避免注释被截断

方法二:手动控制Y轴范围后直接添加注释

在scale_y_break中设置expand = c(0, 0)固定轴范围,直接指定注释的坐标位置:

p1_annotated2 <- ggplot(df1, aes(x, y)) +
  geom_point() +
  scale_y_break(c(8, 18), scales = 1, expand = c(0, 0)) + # 关闭轴扩展,固定范围
  annotate("text", x = 1, y = 21, label = "异常值点", color = "blue") + # 直接指定Y轴位置(超出断裂后范围)
  theme_bw() +
  theme(plot.margin = margin(20, 20, 20, 20))

3. 手动模拟轴断裂(无依赖ggbreak)

如果ggbreak的问题仍无法解决,可手动拆分绘图区域,用子图拼接模拟断裂效果:

# 绘制正常数值范围的子图
p_low <- ggplot(df1, aes(x, y)) +
  geom_point() +
  ylim(3, 8) +
  theme_bw() +
  theme(axis.title.y = element_blank(), axis.text.y = element_text(hjust = 0))

# 绘制异常值范围的子图
p_high <- ggplot(df1, aes(x, y)) +
  geom_point() +
  ylim(18, 21) +
  theme_bw() +
  theme(axis.title.y = element_blank(), axis.text.y = element_text(hjust = 1),
        axis.title.x = element_blank(), axis.text.x = element_blank(),
        axis.ticks.x = element_blank(), panel.border = element_blank())

# 绘制断裂标记
break_sign <- ggplot() +
  annotate("text", x = 1, y = 1, label = "//", size = 8) +
  theme_void()

# 拼接三个部分
(p_low + break_sign + p_high) + plot_layout(widths = c(10, 1, 10))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 19:10:02