Matplotlib共享X轴时zorder无法将图层置于顶层问题排查
TwinX() 导致 Zorder 功能失效的问题排查与解决
我之前也遇到过一模一样的问题!当你用twinx()创建共享X轴的第二个轴时,轴本身的层级(zorder)优先级会覆盖你给线条设置的zorder——默认情况下,新创建的ax2的zorder比原轴ax1更高,所以不管你给ax1上的线条设多大的zorder,都会被ax2的内容盖住。
可行解决方案
核心思路是调整两个轴的层级,让ax1的层级高于ax2,同时把ax1的背景设为透明,避免遮住ax2的内容。下面是修改后的代码:
fig, ax1 = plt.subplots() color = 'tab:red' ax1.set_xlabel('Iterations') ax1.set_ylabel('Non metric loss', color=color) ax1.plot(net_loss_bigger, color=color, zorder=3) ax1.tick_params(axis='y', labelcolor=color) ax2 = ax1.twinx() # instantiate a second axes that shares the same x-axis # 新增:调整轴的层级,让ax1在ax2上方 ax1.set_zorder(ax2.get_zorder() + 1) # 新增:将ax1的背景设为透明,避免遮住ax2的内容 ax1.patch.set_visible(False) color = 'tab:blue' ax2.set_ylabel('metric supervised loss', color=color) ax2.plot(metric_super_loss_bigger, color=color, zorder=2) ax2.tick_params(axis='y', labelcolor=color)
原理说明
ax1.set_zorder(ax2.get_zorder() + 1):把ax1的层级设为比ax2高一级,这样ax1上的所有元素(包括线条)都会显示在ax2元素的上方。ax1.patch.set_visible(False):默认情况下轴的背景是不透明的白色,如果只调高ax1的zorder,它的背景会完全盖住ax2的内容,所以需要把背景设为透明。
这样修改后,你设置的线条zorder就能正常生效了,同时双轴的显示也不会互相遮挡。
内容的提问来源于stack exchange,提问作者DsCpp
相关产品推荐
相关产品推荐

