如何使用ggplot在字符类型x轴上添加截断间隔?
字符类型X轴截断效果实现方案
目前主流绘图工具均可实现该效果,没有通用的内置函数,可参考以下常用语言的实现方案:
Python Matplotlib 实现
Matplotlib没有内置的分类X轴截断API,可通过拼接子图的方式手动实现:
- 先将字符类型的X轴分类映射为连续的整数索引
- 绘制两个左右排列的子图,分别展示需要保留的X轴前后段
- 隐藏两个子图相邻的边框,调整子图间距模拟截断效果
- 手动在子图连接处绘制截断标记,再将X轴刻度替换回原有字符标签
代码示例:
import matplotlib.pyplot as plt import numpy as np # 模拟数据,x为字符类型分类 x_labels = ["A", "B", "C", "D", "E", "F", "G", "H"] x = np.arange(len(x_labels)) y = [3, 4, 2, 5, 98, 101, 97, 104] # 创建两个并排子图,共享y轴 fig, (ax1, ax2) = plt.subplots(1, 2, sharey=True, figsize=(8, 4)) fig.subplots_adjust(wspace=0.05) # 左子图展示前2个分类A、B ax1.bar(x[0:2], y[0:2]) ax1.set_xlim(-0.5, 1.5) # 右子图展示后4个分类E、F、G、H,跳过C、D ax2.bar(x[4:], y[4:]) ax2.set_xlim(3.5, 7.5) # 隐藏中间边框 ax1.spines.right.set_visible(False) ax2.spines.left.set_visible(False) ax2.tick_params(axis='y', left=False) # 替换X轴为原字符标签 ax1.set_xticks(x[0:2]) ax1.set_xticklabels(x_labels[0:2]) ax2.set_xticks(x[4:]) ax2.set_xticklabels(x_labels[4:]) # 绘制截断斜线标记 d = 0.015 kwargs = dict(transform=ax1.transAxes, color='k', clip_on=False) ax1.plot((1-d, 1+d), (-d, +d), **kwargs) ax1.plot((1-d, 1+d), (1-d, 1+d), **kwargs) kwargs.update(transform=ax2.transAxes) ax2.plot((-d, +d), (-d, +d), **kwargs) ax2.plot((-d, +d), (1-d, 1+d), **kwargs) plt.show()
R ggplot2 实现
可以直接使用ggbreak扩展包的scale_x_break()函数实现,无需手动调整子图:
- 直接指定需要截断跳过的X轴分类区间即可,原生支持字符类型的分类X轴
- 可自定义截断标记的样式和间隔
代码示例:
library(ggplot2) library(ggbreak) # 构造测试数据 df <- data.frame( x = c("A","B","C","D","E","F","G","H"), y = c(3,4,2,5,98,101,97,104) ) ggplot(df, aes(x = x, y = y)) + geom_col() + # 指定要截断的X轴分类区间,自动跳过C、D scale_x_break(c("C", "D"))
内容的提问来源于stack exchange,提问作者Chinemerem
相关产品推荐
相关产品推荐

