如何删除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
相关产品推荐
相关产品推荐

