如何用ggplot2创建移除中间部分的条形图?
关于创建截断坐标轴图表的解决方案
一、图表正式名称
这种截断中间冗余区间、聚焦两端关键数据的图表,正式称为截断坐标轴图(Broken Axis Plot),也叫断裂坐标轴图,核心作用是通过隐藏坐标轴的非关键区间,放大展示数据差异明显的区域细节。
二、ggplot2实现方案
在ggplot2生态中,有现成工具包可实现该效果,无需完全手动绘制:
1. 使用ggbreak包(推荐)
ggbreak是专门为ggplot2打造的截断坐标轴工具,支持x/y轴单段或多段截断,操作便捷:
- 安装并加载包:
install.packages("ggbreak") library(ggbreak)
- 基础示例(模拟你的图表场景,截断y轴中间区间):
library(ggplot2) # 模拟数据 df <- data.frame( group = c("Sample1", "Sample2", "Sample3", "Sample4", "Sample5", "Sample6"), value = c(12, 15, 82, 86, 89, 91) ) # 生成截断y轴的图表 ggplot(df, aes(x = group, y = value)) + geom_point(size = 3) + geom_line(group = 1) + scale_y_break(c(20, 78)) # 指定需要截断的数值区间
该包支持自定义截断线样式、多段截断等,详细用法可在R中运行vignette("ggbreak")查看官方文档。
2. 手动拼接实现(个性化需求)
如果需要完全自定义布局和样式,可通过拆分数据、绘制子图再拼接的方式实现,借助patchwork包完成布局:
library(ggplot2) library(patchwork) # 拆分数据为低数值和高数值区间 df_low <- df[df$value < 20, ] df_high <- df[df$value > 78, ] # 绘制低数值区域子图(隐藏x轴标签) p1 <- ggplot(df_low, aes(x = group, y = value)) + geom_point(size = 3) + geom_line(group = 1) + scale_y_continuous(limits = c(8, 20)) + theme(axis.title.x = element_blank(), axis.text.x = element_blank(), axis.ticks.x = element_blank()) # 绘制高数值区域子图 p2 <- ggplot(df_high, aes(x = group, y = value)) + geom_point(size = 3) + geom_line(group = 1) + scale_y_continuous(limits = c(78, 95)) # 上下拼接两个子图 p1 / p2 + plot_layout(heights = c(1, 3))
这种方式灵活性极强,但需手动处理数据拆分和图表布局细节。
三、教程参考
ggbreak包的官方vignette包含多种场景的示例,涵盖单轴/多轴截断、不同几何对象适配等内容,直接在R中运行vignette("ggbreak")即可查看。- 搜索“ggplot2 broken axis”可找到Tidyverse社区、RStudio社区的实践案例,覆盖更多个性化实现场景。
内容的提问来源于stack exchange,提问作者Mir Henglin
相关产品推荐
相关产品推荐

