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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:48:05