防止双轴的网格线从原始轴绘制在艺术家的顶部

a_g*_*est 3 python matplotlib python-3.x multiple-axes

我有一个轴,在其上绘制一些数据,还有另一个双轴,用于在特定刻度位置(原始轴的刻度除外)绘制网格线:

import matplotlib.pyplot as plt
import numpy as np

f, ax = plt.subplots()
ax.set_xlim([0, 1])
ax2 = ax.twiny()
ax2.set_xlim([0, 1])
ax2.set_xticks(np.linspace(0, 1, 11))
ax2.xaxis.grid()
x = np.linspace(0, 1, 100)
ax.plot(x, np.sin(x), label='sin(x)')
ax.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)

现在,这会产生不良效果,即双轴的网格线绘制在原始轴的图例和线图之上。据我了解,这是因为 matplotlib 按照创建的顺序绘制轴,因此zorder没有帮助(因为zorder只指定单个轴的艺术家之间的顺序)。

我知道我可以在双轴上绘制数据ax2(后跟ax2.legend()),但我更愿意按原样进行设置。相反,更改两个轴的绘制顺序应该可以解决问题,但我不知道如何做到这一点。似乎f.get_axes()按创建顺序返回轴,但没有选项可以恢复它。

或者也许还存在另一种解决方案?

例子

Imp*_*est 6

您可以更改轴本身的 zorder。

ax.set_zorder(2)
ax2.set_zorder(1)
ax.patch.set_visible(False)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述