如何在matplotlib跨twinx轴中控制zorder调整曲线显示层级?
双纵轴zorder层级控制方法
核心问题根源
默认twinx()生成的右侧纵轴(ax2)是独立于左侧纵轴(ax1)的画布层,整体默认叠放在ax1的上方。这种情况下,哪怕你在单条绘图语句里设置了zorder参数,ax2上的所有绘图内容也会整体遮挡住ax1的内容,单条线的zorder排序完全不生效。
调整操作步骤
- 先打破两个轴的整体层叠关系:手动将ax2的zorder调整为低于ax1,同时把ax2的不透明背景设为隐藏,避免白底遮挡下层内容
- 待两个轴的层级不再存在整体遮挡后,直接给每条曲线分配对应的全局zorder值,即可实现任意元素的前后层级调整
可直接运行的调整后代码:
from matplotlib import pyplot as plt import numpy as np from scipy.signal import savgol_filter random = np.random.RandomState(0) x1 = np.linspace(-10,10,500)**3 + random.normal(0, 100, size=500) x2 = np.linspace(-10,10,500)**2 + random.normal(0, 100, size=500) fig, ax1 = plt.subplots() ax2 = ax1.twinx() # 轴层级核心调整 ax2.set_zorder(ax1.get_zorder() - 1) ax2.patch.set_visible(False) # 按需求分配曲线层级:蓝色含噪曲线放背景层,橙色平滑曲线放前景层 ax1.plot(x1, zorder=1, color="#1f77b4") ax1.plot(savgol_filter(x1, 99, 2), zorder=3, color="#ff7f0e") ax2.plot(x2, zorder=2, color="#1f77b4", alpha=0.7) ax2.plot(savgol_filter(x2, 99, 2), zorder=4, color="#ff7f0e", alpha=0.7) plt.show()
常见踩坑提示
- 必须同时设置
ax2.patch.set_visible(False),否则即便调低了ax2的zorder,它自带的白色画布背景仍会完全遮挡下方ax1的所有绘图内容 - zorder数值为全局排序规则,数值越小元素越靠后(背景层),数值越大越靠前(前景层),你可以根据展示需求自由调整不同曲线的zorder数值
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

