如何使用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提供坐标轴截断功能的扩展包,操作成本最低:
- 首次使用先安装加载包:
install.packages("ggbreak") library(ggbreak)
- 在原有绘图代码基础上添加坐标轴截断设置即可:
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
相关产品推荐
相关产品推荐

