grid zorder似乎没有生效(matplotlib)

mma*_*ski 6 python matplotlib

我试图使用python的matplotlib在网格上绘制散点(1.4.3但在其他版本上尝试也没有成功).一切都有效,除了网格zorder位置.我将网格设置zorder为低于scatter网格,但网格仍然覆盖散点.

这是一个重现问题的简单代码:

import numpy as np
from matplotlib import pyplot as plt

# create points
pnts = np.array([[1., 1.], [1., 1.2]])

# create figure
plt.grid(True, linestyle='-', color='r', zorder=1)
plt.scatter(pnts[:,0], pnts[:,1], zorder=2)
plt.ylim([0, 2])
plt.xlim([0, 2])
plt.savefig('testfig.png', dpi=350)
Run Code Online (Sandbox Code Playgroud)

我明白了:
如果你放大点,你可以看到网格在顶部,虽然它有较低的zorder: 在此输入图像描述

这是一个错误还是我做错了什么?

Gab*_*iel 10

如果有人在几年后仍然想知道这个问题(像我一样),这是一个长期存在的问题(2015 年 9 月):

Axes.grid() 不遵守指定的“zorder”kwarg

引用问题:

Axes.grid() 不支持提供的自定义 zorder。相反,网格的 zorder 似乎固定在 2.5 和 2.6 之间的某个神奇值(我在 rcParams 中找不到网格 zorder 的键)。

显然,到目前为止唯一的解决方案是:

只需将 2.5 添加到您的所有 z-order。

在这个问题Matplotlib 中也有一个旧答案:在其他图形元素后面绘制网格线,但它似乎不再起作用。

  • 添加 2.5 并将一个 zorder 值设置为 -1 都不适用于我尝试过的至少一个图(matplotlib 2.2.3),我认为这不是问题的实际解决方案。 (5认同)
  • 您还可以为表现不佳的元素设置 z 顺序负值(即“zorder=-1”),以迫使它们排在后面。 (2认同)

Sta*_*tan 7

以下对我有用:

ax.set_axisbelow(True)
Run Code Online (Sandbox Code Playgroud)

从文档Axes.grid中的“注释”部分:

轴作为一个单元进行绘制,因此绘制网格的有效 zorder 由每个轴的 zorder 决定,而不是由构成网格的 Line2D 对象的 zorder 决定。因此,要设置网格 zorder,请使用下面的 set_axis,或者为了进行更多控制,请调用每个轴的 set_zorder 方法。

此设置的默认值为

>>> import matplotlib as mpl
>>> mpl.rcParams["axes.axisbelow"]
'line'
Run Code Online (Sandbox Code Playgroud)

根据文档,Axes.set_axisbelow可能的值是:

  • True(zorder = 0.5):刻度线和网格线位于所有艺术家下方。
  • 'line'(zorder = 1.5):刻度线和网格线位于补丁上方(例如,矩形,默认 zorder = 1),但仍位于线条和标记下方(默认 zorder = 2)。
  • False(zorder = 2.5):刻度线和网格线位于补丁和线条/标记上方。