
本文介绍在 python 的 matplotlib 中绘制具有“断裂式 x 轴”(broken x-axis)的图表,即在指定区间(如 20–299)留白、仅显示关键点(5, 10, 15, 300),避免数据被压缩或误导性拉伸。
在科学绘图中,当数据点在 x 轴上分布极不均匀(例如:[5, 10, 15, 300]),直接绘制会因巨大间隙导致前三点严重聚拢、最后一项孤立右侧,丧失可读性。此时,真正的解决方案不是图像后期处理(如用 PIL 裁剪 PNG),而是使用 Matplotlib 原生支持的「断裂坐标轴」(broken axis)技术——通过 matplotlib.pyplot.broken_barh 或更推荐的 mpl_toolkits.axes_grid1.parasite_axes 配合 twiny() 实现逻辑断点,或采用更简洁稳健的 brokenaxes 第三方库。
✅ 推荐方案:使用 brokenaxes 库(最直观、可复现、专业级)
首先安装:
pip install brokenaxes
完整示例代码(适配您的声强实验场景):
import matplotlib.pyplot as plt
from brokenaxes import brokenaxes
import numpy as np
# 模拟用户输入(实际中保留 input())
x1 = float(input("Voer geluidssterkte op afstand 1 in: ")) # e.g., 85.2
x2 = float(input("Voer geluidssterkte op afstand 2 in: ")) # e.g., 78.6
x3 = float(input("Voer geluidssterkte op afstand 3 in: ")) # e.g., 72.1
x4 = float(input("Voer geluidssterkte op afstand 4 in: ")) # e.g., 45.9
x = [5, 10, 15, 300]
y = [x1, x2, x3, x4]
# 创建断裂 x 轴:保留 [0, 20] 和 [290, 310] 两段,中间用斜线标记断裂
bax = brokenaxes(
xlims=((0, 20), (290, 310)), # 两段 x 区间
hspace=.05, # 断裂间隙高度(相对值)
despine=False
)
bax.plot(x, y, color='blue', linewidth=1.5, marker='o',
markerfacecolor='red', markersize=6)
bax.set_xlabel('afstand (cm)')
bax.set_ylabel('geluidssterkte (dB)')
bax.set_title('Geluidssterkte vs. Afstand (x-as met onderbreking)')
# 可选:自定义断裂处刻度标签(如显示 20 和 300)
bax.set_xticks([5, 10, 15, 300])
bax.set_xticklabels(['5', '10', '15', '300'])
plt.show()⚠️ 注意事项:
- brokenaxes 自动绘制断裂符号(两条斜短线),视觉上清晰传达“此处跳过”,符合学术出版规范;
- 不要滥用 twiny() 手动叠加轴(如原问题第二段代码):它仅伪造标签,未真正分离坐标逻辑,易导致刻度错位、图例混乱;
- 避免“用 PIL 裁剪图像”等 hack 方式:破坏矢量图质量、无法缩放、不可复现、违背数据可视化原则;
- 若需完全自定义(如指定跳过 20–299),可改用 matplotlib.patches.ConnectionPatch 手动连接两子图,但复杂度高,仅建议高级用户。
? 总结:面对非均匀 x 值,优先选择语义明确、维护性强的专用工具。brokenaxes 是 Matplotlib 生态中最成熟、文档最完善的断裂轴解决方案,一行配置即可生成专业级断裂图,兼顾准确性与可读性。










