在网格的小刻度线的相交处绘制标记

时间:2019-01-10 16:27:41

标签: python python-3.x matplotlib

我想生成一个带有网格的图,以便在主要刻度线处绘制一条实线,而在较小刻度线的交点处用正方形(或任何可自定义的标记)标记。

以下是我要实现的目标的一个示例:enter image description here

我使用RegularPolyCollection使用以下代码生成了该图:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import RegularPolyCollection

# Define dimensions and create plotting objects
width_squares = 6
height_squares = 6
figure = plt.figure()
ax = figure.add_subplot(111)

# Define ticks
x_minors = np.linspace(0, width_squares, 5 * width_squares + 1)
x_majors = np.linspace(0, width_squares, width_squares + 1)
y_minors = np.linspace(0, height_squares, 5 * height_squares + 1)
y_majors = np.linspace(0, height_squares, height_squares + 1)

# Set ticks
ax.set_xticks(x_majors)
ax.set_xticks(x_minors, minor=True)
ax.set_yticks(y_majors)
ax.set_yticks(y_minors, minor=True)

# Define window
ax.set_xlim((0, 6))
ax.set_ylim((0, 6))

# Draw the point collection: squares rotated by 45°
offsets = [(x, y) for x in x_minors for y in y_minors]
points = RegularPolyCollection(
    4,
    sizes=(1,),
    offsets=offsets, 
    color=('lightgray',),
    transOffset=ax.transData,
    rotation=0.7857
)
ax.add_collection(points)

# Draw the grid at major ticks
ax.grid(True, which='major', axis='both', color='lightgray')

plt.show()

但是,我实际上试图制作的地块要大得多,并且性能受到威胁。 不幸的是,绘制大量的点非常耗时。

我还基于this question进行了研究,并通过将linestyle设置为"None"的垂直线绘制垂直线,从而产生了相似的结果,因此只标记了交叉点,但时间消耗却是类似于收集方法。

我怀疑plt.grid函数应该使用参数组合来产生所需的内容,但是我无法理解markevery和其他关键字参数的作用(尽管我确实了解了它们的作用)与Line2D对象一起使用时的含义。)

是否有生产这种网格的标准方法?如果是这样,是否有可能使其花费很少的时间?

1 个答案:

答案 0 :(得分:1)

我不确定您是否从共享链接中提供的答案中尝试了其中一种。我要做的主要修改是在获取x-tick和y-tick数据时打开次刻度。您是否有任何数字可以比较这种方法和Line2D的时间复杂度?

# Draw the grid at major ticks
ax.grid(True, which='major', axis='both')
ax.set_aspect('equal')

def set_grid_cross(ax):
    xticks = ax.get_xticks(minor=True)
    yticks = ax.get_yticks(minor=True)
    xgrid, ygrid = np.meshgrid(xticks, yticks)
    kywds = dict() 
    grid_lines = ax.plot(xgrid, ygrid, 'o', ms=2, color='lightgray', alpha=0.5)

set_grid_cross(ax)

enter image description here