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

如何删除Matplotlib轴的部分区域?解决set_ylim导致误差棒截断问题

解决Matplotlib误差棒截断与轴部分区域删除问题

一、误差棒被截断的问题

当你用ax.set_ylim([0,10])替代set_yticks时,误差棒出现截断,核心原因是部分误差棒的范围超出了你设置的轴上下限,Matplotlib默认会裁剪超出轴范围的绘图元素。比如你数据里第7个点(x=0.7)的y值是0.44,误差是3.61,它的误差棒下限是0.44-3.61=-3.17,这个值远小于你设置的ylim下限0,所以这部分误差棒就被裁剪掉了。

你可以用以下几种方法解决:

  • 禁止误差棒被裁剪:在调用errorbar时添加clip_on=False参数,这样即使误差棒超出轴范围也会完整显示:
    ax.errorbar(x, y, yerr=err, clip_on=False)
    
  • 调整轴范围容纳误差棒:把ylim的下限设为负数,比如ax.set_ylim([-4, 10]),这样就能完整显示所有误差棒;
  • 自动调整轴边距:使用ax.margins(y=0.1)让Matplotlib自动给轴范围添加10%的边距,给误差棒留出显示空间。

二、删除轴的部分区域

如果你想删除轴的某一段(比如只显示x轴0.2到1.0的部分,或者隐藏y轴的某一段),可以用这些方法:

1. 隐藏spine的指定区间

直接设置spine的显示范围,超出这个范围的轴部分会被隐藏。比如:

# 让x轴只显示0.2到1.0的部分
ax.spines['bottom'].set_bounds(0.2, 1.0)
# 让y轴只显示1到8的部分
ax.spines['left'].set_bounds(1, 8)

这种方法适合只需要保留轴中间一段的场景。

2. 创建断轴(Broken Axis)

如果需要让轴在中间断开(比如y轴在4的位置断开,分别显示0-4和4-10的区间),可以通过创建两个子图拼接实现,示例代码如下:

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(0.1,1.1,step=0.1)
y = np.array([0.03,0.03,0.05,0.05,0.06,0.17,0.44,1.37,4.43,6.89])
err = np.array([0.02,0.03,0.05,0.06,0.07,0.23,3.61,4.70,1.2,0.7])

# 创建上下两个子图,共享x轴
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10,8), sharex=True)
fig.subplots_adjust(hspace=0.05)  # 减小子图间距,模拟断轴效果

# 在两个子图中分别绘制数据
ax1.errorbar(x, y, yerr=err)
ax2.errorbar(x, y, yerr=err)

# 设置两个子图的y轴范围
ax1.set_ylim(4, 10)  # 上半部分显示4-10
ax2.set_ylim(0, 4)   # 下半部分显示0-4

# 隐藏不需要的spine和刻度
ax1.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax1.xaxis.tick_top()
ax1.tick_params(labeltop=False)  # 隐藏上子图的x刻度标签
ax2.xaxis.tick_bottom()

# 添加断轴的斜线标记
d = 0.015  # 斜线的长度
kwargs = dict(transform=ax1.transAxes, color='k', 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)

# 统一设置其他样式
for ax in [ax1, ax2]:
    ax.spines['right'].set_visible(False)
    ax.set_ylabel('Y')
ax2.set_xlabel('X')
plt.show()

3. 自定义Spine路径(进阶)

如果需要更复杂的轴形状,可以使用matplotlib.path.Path自定义spine的显示路径,比如让轴呈现折线或其他形状,但这个方法需要对Matplotlib的路径系统有一定了解,适合高级定制场景。

内容的提问来源于stack exchange,提问作者Sam Macharia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 07:22:49