几年后,Gabriel 引用的 issue 已更新为以下内容,并于 2019 年 4 月关闭。
这必须是刻度线和网格线系统大修的一部分,我怀疑这可能只是更重大重构的一个组成部分,所以我认为在可预见的未来的解决方案是文档调整在#13995。
对于需要具有任意 zorder 值的网格的情况,一种解决方法是使用 plot() 模拟 grid()。我编写了函数以尽可能接近地复制标准 grid() 行为(默认使用 rcParam 值)。
import matplotlib.pyplot as plt
from matplotlib import rcParams
import numpy as np
# emulate grid using Axes.plot()
def zorder_grid(ax=None, zorder=1.5, which=None, axis=None, alpha=None,
color=None, linestyle=None, linewidth=None, **kwargs):
# Honor rcParams values if keywords not specified
if ax is None:
ax = plt.gca()
if which is None:
which = rcParams['axes.grid.which']
if axis is None:
axis = rcParams['axes.grid.axis']
if alpha is None:
alpha = rcParams['grid.alpha']
if color is None:
color = rcParams['grid.color']
if linestyle is None:
linestyle = rcParams['grid.linestyle']
if linewidth is None:
linewidth = rcParams['grid.linewidth']
# get coordinates for grid lines
xlim = ax.get_xlim()
ylim = ax.get_ylim()
xticks = []
yticks = []
if which in ['major', 'both']:
xticks = np.concatenate((xticks, ax.get_xticks()))
yticks = np.concatenate((yticks, ax.get_yticks()))
if which in ['minor', 'both']:
xticks = np.concatenate((xticks, ax.get_xticks(minor=True)))
yticks = np.concatenate((yticks, ax.get_yticks(minor=True)))
# plot grid using Axes.plot()
if axis in ['x', 'both']:
for tick in xticks:
ax.plot([tick, tick], ylim, linestyle=linestyle, color=color,
linewidth=linewidth, alpha=alpha, zorder=zorder, **kwargs)
if axis in ['y', 'both']:
for tick in yticks:
ax.plot(xlim, [tick, tick], linestyle=linestyle, color=color,
linewidth=linewidth, alpha=alpha, zorder=zorder, **kwargs)
注意事项:
- 必须在调用
zorder_grid() 之前手动设置x 和y 限制。如果手动指定刻度,则还需要在绘制网格线之前完成。
- 如果轴限制和/或刻度动态变化(例如动画),则会出现问题。可能的解决方案可能是清除帧之间的轴或返回 Line2D 列表并切换可见性。
可以如下调用该函数以在 MWE 中产生所需的输出(任何 zorder
pnts = np.array([[1., 1.], [1., 1.2]])
plt.scatter(pnts[:,0], pnts[:,1])
plt.ylim([0, 2])
plt.xlim([0, 2])
zorder_grid(zorder=0.99, linestyle='-', color='r')
plt.savefig('testfig.png', dpi=350)
以上代码生成的图。