import matplotlib.pyplot as pltimport numpy as np# ---------------------- 1. 准备数据(模拟数值差距极大的场景) ----------------------categories = ['A', 'B', 'C', 'D', 'E'] # 类别values = [15, 12, 1000, 8, 11] # 数值:C=1000(极大),其余都是个位数# ---------------------- 2. 创建断裂的Y轴画布(上下两个子图) ----------------------fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6), sharex=True)# 绘制柱状图(两个子图都画,实现视觉连贯)ax1.bar(categories, values, color='#2E86AB', width=0.6)ax2.bar(categories, values, color='#2E86AB', width=0.6)# ---------------------- 3. 设置Y轴断裂范围(核心步骤) ----------------------# 上方子图:显示大数值区间ax1.set_ylim(950, 1050) # 只显示950~1050的范围(容纳C=1000)# 下方子图:显示小数值区间ax2.set_ylim(0, 20) # 只显示0~20的范围(容纳其余小数值)# ---------------------- 4. 隐藏中间边框,添加断裂符号 ----------------------# 隐藏上方子图的底部边框、下方子图的顶部边框ax1.spines['bottom'].set_visible(False)ax2.spines['top'].set_visible(False)# 隐藏顶部子图的x轴刻度(避免重复)ax1.tick_params(axis='x', bottom=False)# 添加断裂符号(//),让断裂处更直观d = 0.015 # 断裂符号的倾斜度kwargs = dict(transform=ax1.transAxes, color='black', clip_on=False)ax1.plot((-d, +d), (-d, +d), **kwargs) # 左上角断裂线ax1.plot((1 - d, 1 + d), (-d, +d), **kwargs) # 右上角断裂线kwargs.update(transform=ax2.transAxes)ax2.plot((-d, +d), (1 - d, 1 + d), **kwargs) # 左下角断裂线ax2.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs) # 右下角断裂线# ---------------------- 5. 添加图表标题和标签 ----------------------fig.suptitle('带断裂的柱状图(数值差距过大优化)', fontsize=14, fontweight='bold')ax2.set_xlabel('类别', fontsize=12)ax2.set_ylabel('数值', fontsize=12)# 调整布局,防止标签重叠plt.tight_layout()plt.show()