Matplotlib如何实现类石头剪刀布的循环zorder绘制优先级
Matplotlib 循环层叠zorder配置方案
核心原理
Matplotlib默认采用线性zorder规则控制层叠顺序:数值越大的元素越靠近顶层,但这种线性规则无法直接实现A压B、B压C、C压A的石头剪刀布式循环覆盖。要实现这类需求,不能仅靠调整zorder数值,需要结合裁剪逻辑控制元素的实际绘制范围,再配合zorder赋值+轴参数设置实现目标效果。
参数配置说明
首先必须正确设置轴层参数:
ax.set_axisbelow(False):必须设为False。如果该参数为True,网格会被强制放到所有绘图元素的最底层,无法通过zorder调整到填充层上方、图像层下方的中间位置。
各元素zorder取值(数值越大越靠近顶层)及配套操作:
- 元素D(
ax.plot绘制的曲线):zorder=10,取远大于其他元素的数值,保证始终在所有元素最顶层,无需额外操作。 - 元素A(
ax.imshow绘制的图像层):zorder=4,zorder高于网格层,保证图像显示区域内网格被压在图像下方;关键配套操作:给imshow对象设置裁剪路径,裁掉fill_between覆盖的填充区域,让图像仅在填充区域外绘制,从根本上避免图像遮挡填充层。 - 元素C(
ax.grid绘制的网格线):zorder=3,zorder高于填充层、低于图像层,实现填充区域内网格显示在填充色上方、图像区域内网格被压在图像下方的效果。 - 元素B(
ax.fill_between绘制的填充区域):zorder=2,为所有元素里zorder最低的绘图元素,由于图像层已经被裁剪掉填充区域的部分,填充层会自然在填充区域内显示在最下方,被网格和曲线覆盖,同时不会被图像层遮挡。
补全后的代码框架
from matplotlib import pyplot as plt import matplotlib.figure fig = matplotlib.figure.Figure() ax = fig.subplots() x, y, X = ... # 业务数据,此处省略具体定义 # 先绘制填充层,拿到填充对象用于后续裁剪 fill_obj = ax.fill_between(x, y, zorder=2) # 元素B im_obj = ax.imshow(X, ..., zorder=4) # 元素A # 给imshow设置反向裁剪:填充区域内不显示图像 im_obj.set_clip_path(fill_obj) im_obj.set_inverted_clip(True) ax.plot(x, y, zorder=10) # 元素D ax.set_axisbelow(False) ax.grid(..., zorder=3) # 元素C
效果核对
配置完成后完全符合需求:
- 填充区域(B)范围内:从下到上依次是填充色→网格线→顶层曲线,网格清晰显示在填充色上方
- 非填充区域(A)范围内:从下到上依次是彩虹图像→顶层曲线,网格被压在图像下方不可见
- 填充区域完全遮挡图像层,曲线始终在最顶层
- 完美实现“网格位于彩虹填充色下方、白色填充区域上方”的典型场景效果
内容的提问来源于stack exchange,提问作者Riikka
相关产品推荐
相关产品推荐

