而不是绘图上的网格线,matplotlib打印网格十字架?

a d*_*ben 7 python matplotlib

我希望在绘图上有一些网格线,但实际上全长线太多/分散注意力,甚至是浅灰色线条.我去手动对SVG输出进行了一些编辑,以获得我想要的效果.这可以用matplotlib完成吗?我看了一下网格的pyplot api,我唯一可以看到它可以接近它的是xdata和ydata Line2D kwargs.

在此输入图像描述

Yan*_*ann 4

这无法通过基本 API 完成,因为网格线仅使用两个点创建。网格线在每个刻度线处都需要一个“数据”点,以便绘制标记。下面的示例显示了这一点:

import matplotlib.pyplot as plt

ax = plt.subplot(111)
ax.grid(clip_on=False, marker='o', markersize=10)
plt.savefig('crosses.png')
plt.show()
Run Code Online (Sandbox Code Playgroud)

这导致:

在此输入图像描述

请注意标记'o'仅位于轴边缘的开头和结尾,因为网格线仅涉及两个点。

您可以编写一个方法来模拟您想要的内容,使用一系列创建十字标记Artists,但利用基本绘图功能来绘制十字图案会更快。

这就是我在以下示例中所做的:

import matplotlib.pyplot as plt
import numpy as np

NPOINTS=100

def set_grid_cross(ax, in_back=True):
    xticks = ax.get_xticks()
    yticks = ax.get_yticks()
    xgrid, ygrid = np.meshgrid(xticks, yticks)
    kywds = dict() 
    if in_back:
        kywds['zorder'] = 0
    grid_lines = ax.plot(xgrid, ygrid, 'k+', **kywds)

xvals = np.arange(NPOINTS)
yvals = np.random.random(NPOINTS) * NPOINTS

ax1 = plt.subplot(121)
ax2 = plt.subplot(122)

ax1.plot(xvals, yvals, linewidth=4)
ax1.plot(xvals, xvals, linewidth=7)
set_grid_cross(ax1)
ax2.plot(xvals, yvals, linewidth=4)
ax2.plot(xvals, xvals, linewidth=7)
set_grid_cross(ax2, in_back=False)

plt.savefig('gridpoints.png')
plt.show()
Run Code Online (Sandbox Code Playgroud)

结果如下图所示:

在此输入图像描述

正如您所看到的,我使用 x 和 y 中的刻度线来定义一系列我想要网格标记(“+”)的点。我过去常常meshgrid采用两个一维数组并制作两个对应于每个网格点上的双循环的二维数组。我用标记样式绘制此图'+',然后我就完成了......差不多了。这会在顶部绘制十字,并且我添加了一个额外的关键字来重新排序与该图相关的线条列表。zorder如果要在所有内容后面绘制网格标记,我会调整它们。*****

该示例显示左侧子图,默认情况下网格放置在后面,右侧子图禁用此选项。如果您沿着每个图中的绿线,您会注意到差异。

如果您对边框上的网格十字感到困扰,可以在定义网格之前删除 x 和 y 的第一个和最后一个刻度线set_grid_cross,如下所示:

xticks = ax.get_xticks()[1:-1] #< notice the slicing
yticks = ax.get_yticks()[1:-1] #< notice the slicing
xgrid, ygrid = np.meshgrid(xticks, yticks)
Run Code Online (Sandbox Code Playgroud)

我在下面的示例中这样做,使用更大、不同的标记来表达我的观点:

在此输入图像描述

***** 感谢@fraxel 的回答指出了这一点。