Matplotlib: 在其他图形元素后面绘制网格线

在 Matplotlib,我画了如下的虚线网格:

fig = pylab.figure()
ax = fig.add_subplot(1,1,1)
ax.yaxis.grid(color='gray', linestyle='dashed')

然而,我不能找到如何(或者甚至是否可能)使网格线被画在其他图形元素后面,比如条形图。更改添加网格的顺序与添加其他元素的顺序没有区别。

有没有可能让网格线出现在其他所有东西的后面?

145497 次浏览

根据这个-http://matplotlib.1069221.n5.nabble.com/axis-elements-and-zorder-td5346.html-你可以使用 Axis.set_axisbelow(True)

(我现在正在第一次安装 matplotlib,所以不知道这是否正确-我只是通过搜索“ matplotlib z order grid”找到了它-“ z order”通常用来描述这类事情(z 是“页外”的轴))

我也遇到了同样的问题,以下方法奏效了:

[line.set_zorder(3) for line in ax.lines]
fig.show() # to update

如果 3不起作用,则将其增加到更高的值。

对我来说,不清楚如何应用 Andrew Cooke 的回答,所以这是一个完整的解决方案:

ax.set_axisbelow(True)
ax.yaxis.grid(color='gray', linestyle='dashed')

如果要验证 所有数字的设置,可以设置

plt.rc('axes', axisbelow=True)

或者

plt.rcParams['axes.axisbelow'] = True

它适用于 Matplotlib > = 2.0。

你可以尝试使用 Seborn 的其中一种风格,例如:

import seaborn as sns
sns.set_style("whitegrid")

不仅网格线会落后,而且外观也会更好看。

您还可以在 matplotlib.pyplot.grid中设置 zorder kwarg

plt.grid(which='major', axis='y', zorder=-1.0)

对于一些人(比如我)来说,只在其他元素的“一些”后面绘制网格可能会很有趣。对于绘图顺序的粒度控制,可以直接在轴上使用 Matplotlib.Artist.set _ zorder:

ax.yaxis.grid(color='gray', linestyle='dashed')
ax.set_zorder(3)

这在 Matplotlib.ax.Axes.grid的说明中已经提到。