如何修改Matplotlib中Patch自定义填充图案的平铺方式?
修改Matplotlib自定义填充图案的平铺方式(网格状替代错缝)
问题说明
需要将Matplotlib Patch内的自定义填充图案从默认的错缝排列(砖块式)改为网格状平铺(每行对齐),现有自定义Hatch代码生成的是错缝效果,需调整核心逻辑。
核心修改思路
Matplotlib内置的Shapes类生成错缝的原因是:在计算每行图案的顶点时,会给奇数行添加0.5倍图案尺寸的X轴偏移。要实现网格状平铺,需重写Shapes类的set_vertices方法,强制所有行的X偏移量为0,取消错缝逻辑。
修改后的完整代码
import matplotlib.pyplot as plt import matplotlib.patches as patches import matplotlib.hatch # 定义自定义填充图案的路径(基于[-0.5, 0.5]的标准范围) square_path = patches.Polygon( [[-0.4, -0.4], [0.4, -0.4], [0.4, 0.4], [-0.4, 0.4]], closed=True, fill=False).get_path() class SquareHatch(matplotlib.hatch.Shapes): """自定义网格状填充图案,标识符's'""" filled = True size = 1.0 path = square_path def __init__(self, hatch, density): self.num_rows = int((hatch.count('s')) * density) self.shape_vertices = self.path.vertices self.shape_codes = self.path.codes super().__init__(hatch, density) def set_vertices(self, vertices, path): """重写顶点计算逻辑,取消错缝偏移""" num_rows = self.num_rows num_cols = self.num_cols size = self.size # 遍历所有行,强制X偏移为0,实现网格对齐 for i in range(num_rows): y = -0.5 + (i + 0.5) / num_rows for j in range(num_cols): x = -0.5 + (j + 0.5) / num_cols # 所有行使用相同的X偏移,无错缝 vertices[:] += [x * size, y * size] path.append((vertices, self.shape_codes)) vertices = vertices.copy() - [x * size, y * size] # 注册自定义Hatch类型 matplotlib.hatch._hatch_types.append(SquareHatch) # 测试代码 fig, ax = plt.subplots() # 创建带自定义网格填充的矩形 square = patches.Rectangle(xy=(0.25, 0.25), width=0.5, height=0.5, hatch='s', fill=False) ax.add_patch(square) # 设置坐标轴范围,确保图案完整显示 ax.set_xlim(0, 1) ax.set_ylim(0, 1) plt.show()
关键修改点解析
- 修正图案路径范围:原代码中路径的X坐标超出了[-0.5,0.5]的标准范围,导致图案变形,修改为
0.4以适配标准边界。 - 重写
set_vertices方法:去掉原逻辑中对奇数行添加0.5*sizeX偏移的代码,让每行的X起始位置完全对齐,实现网格状平铺。 - 继承与初始化优化:使用
super()替代直接调用父类初始化,代码更规范。
内容的提问来源于stack exchange,提问作者Regneva
相关产品推荐
相关产品推荐

