我想生成一个带有网格的图,以便在主要刻度线处绘制一条实线,而在较小刻度线的交点处用正方形(或任何可自定义的标记)标记。
我使用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
对象一起使用时的含义。)
是否有生产这种网格的标准方法?如果是这样,是否有可能使其花费很少的时间?
答案 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)