如何用Matplotlib或Seaborn实现带分层的断裂折线图?
实现垂直分层断裂轴图表的方法及名称说明
图表名称
这类图表被称为垂直分层断裂轴图(Vertically Stacked Broken Axis Chart),核心是将跨度极大的不连续数据区间拆分为上下分层的子图展示,既保留断裂轴的信息,又通过分层让不同区间的趋势更清晰。
实现方法
brokenaxes默认是在同一平面实现轴断裂,要达到分层效果,可通过Matplotlib的子图(subplots)手动构建上下分层结构,配合轴样式调整和断裂标记来实现,代码示例如下:
import matplotlib.pyplot as plt import numpy as np # 创建上下两个子图,共享Y轴,自定义高度比例 fig, (ax_upper, ax_lower) = plt.subplots(2, 1, figsize=(8, 5), sharey=True, gridspec_kw={'height_ratios': [1, 3]}) # ---------------------- 下层子图:展示左侧数据区间 ---------------------- x_left = np.linspace(0, 10, 100) ax_lower.plot(x_left, np.sin(x_left), label='Part 1') ax_lower.set_xlim(0, 10) # 隐藏子图顶部边框 ax_lower.spines['top'].set_visible(False) # 添加顶部的断裂斜线标记 d = 0.015 # 控制断裂标记的大小 kwargs = dict(transform=ax_lower.transAxes, color='black', clip_on=False) ax_lower.plot((-d, +d), (-d, +d), **kwargs) # 左下断裂标记 ax_lower.plot((1 - d, 1 + d), (-d, +d), **kwargs) # 右下断裂标记 # ---------------------- 上层子图:展示右侧数据区间 ---------------------- x_right = np.linspace(195, 200, 100) ax_upper.plot(x_right, np.cos(x_right), label='Part 2') ax_upper.set_xlim(195, 200) # 隐藏子图底部边框,取消底部刻度 ax_upper.spines['bottom'].set_visible(False) ax_upper.tick_params(axis='x', bottom=False) # 添加底部的断裂斜线标记 kwargs.update(transform=ax_upper.transAxes) ax_upper.plot((-d, +d), (1 - d, 1 + d), **kwargs) # 左上断裂标记 ax_upper.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs) # 右上断裂标记 # 调整子图间距,让分层更紧凑 plt.subplots_adjust(hspace=0.05) # 添加统一图例 fig.legend(loc='upper right') plt.show()
代码说明
- 通过
gridspec_kw可以自定义上下子图的高度比例,适配不同数据的展示需求; - 共享Y轴(
sharey=True)保证上下层数据的Y轴刻度一致,避免视觉混淆; - 手动添加的斜线标记模拟轴断裂的视觉效果,隐藏相邻边框让分层更自然;
- 相比
brokenaxes,这种方式更灵活控制分层布局和样式细节。
内容的提问来源于stack exchange,提问作者Explorer
相关产品推荐
相关产品推荐

