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

如何使用R语言ggplot2绘制带不连续断裂X轴的箱线图?

如何在ggplot2的箱线图X轴添加截断斜线标记表示坐标轴非连续

我有一个包含两列的dataframe dat,分别为:

  • Month列
  • Value列
    希望在箱线图的X轴上添加两条斜线,斜线之间留空,以此突出显示X轴是非连续的。

示例数据与基础箱线图代码

library(ggplot2)
set.seed(321)
dat <- data.frame(matrix(ncol = 2, nrow = 18))
x <- c("Month", "Value")
colnames(dat) <- x
dat$Month <- rep(c(1,2,3,10,11,12),3)
dat$Value <- rnorm(18,20,2)

ggplot(data = dat, aes(x = factor(Month), y = Value)) +
  geom_boxplot() +
  labs(x = "Month") +
  theme_bw() +
  theme(panel.grid = element_blank(),
        text = element_text(size = 16),
        axis.text.x = element_text(size = 14, color = "black"),
        axis.text.y = element_text(size = 14, color = "black"))

实现方案

这里提供两种常用实现方式,按需选择即可:

方法1:使用ggbreak包快速实现(推荐)

ggbreak是专门为ggplot2提供坐标轴截断功能的扩展包,操作成本最低:

  1. 首次使用先安装加载包:
install.packages("ggbreak")
library(ggbreak)
  1. 在原有绘图代码基础上添加坐标轴截断设置即可:
ggplot(data = dat, aes(x = factor(Month), y = Value)) +
  geom_boxplot() +
  labs(x = "Month") +
  theme_bw() +
  theme(panel.grid = element_blank(),
        text = element_text(size = 16),
        axis.text.x = element_text(size = 14, color = "black"),
        axis.text.y = element_text(size = 14, color = "black")) +
  # 设置X轴截断位置,因子型X轴3和10对应的刻度位置分别是3、4,截断位置取3.5附近即可
  scale_x_break(c(3.5, 3.7), space = 0.1) +
  # 按需调整截断标记的样式
  theme(break.x = element_line(color = "black", linewidth = 0.8))

方法2:自定义注释绘制截断标记(无需额外安装包)

如果不想依赖第三方包,可以手动在两个刻度之间添加斜线注释:

p <- ggplot(data = dat, aes(x = factor(Month), y = Value)) +
  geom_boxplot() +
  labs(x = "Month") +
  theme_bw() +
  theme(panel.grid = element_blank(),
        text = element_text(size = 16),
        axis.text.x = element_text(size = 14, color = "black"),
        axis.text.y = element_text(size = 14, color = "black")) +
  # 关闭默认X轴线,方便自定义绘制带截断的轴线
  theme(axis.line.x = element_blank())

# 手动添加X轴线和截断斜线
p + 
  # 绘制左侧段X轴
  annotate("segment", x = 0, xend = 3.4, y = min(dat$Value)-0.8, yend = min(dat$Value)-0.8) +
  # 绘制右侧段X轴
  annotate("segment", x = 3.8, xend = 6.5, y = min(dat$Value)-0.8, yend = min(dat$Value)-0.8) +
  # 绘制两条截断斜线
  annotate("segment", x = 3.4, xend = 3.5, y = min(dat$Value)-0.7, yend = min(dat$Value)-0.9, linewidth = 0.8) +
  annotate("segment", x = 3.7, xend = 3.8, y = min(dat$Value)-0.7, yend = min(dat$Value)-0.9, linewidth = 0.8) +
  # 调整Y轴范围避免截断标记被裁剪
  ylim(min(dat$Value)-1, max(dat$Value)+1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 22:45:00