You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Matplotlib是否存在‘空’Patch对象?索引越界问题求助

解决Matplotlib Patch索引越界问题 & 空Patch替代方案

咱们先拆解下你遇到的索引越界错误:你的循环里只有当val == 1时才会往self.patches里添加元素,但不管val是0还是1,你都执行ax.add_patch(self.patches[i])——这就导致当val=0时,self.patches的长度还没到i+1,自然会触发索引越界。

针对你的需求,有两种更优的解决方案,比添加背景色矩形要更高效:

方案1:只添加需要显示的Patch(推荐)

既然0的位置要留空,那完全可以跳过这些位置,只在val=1时创建并添加Patch,这样既不会有索引问题,也不用绘制多余的元素:

fig = plt.figure()
ax = plt.axes()
self.patches = []
for i, val in enumerate(my_list):
    if val == 1:
        patch = plt.Rectangle((i, 0), 0.9, 1, angle=0.0, facecolor='r', edgecolor='w', linewidth='2.0', animated=False)
        self.patches.append(patch)
        ax.add_patch(patch)

这种方法简单直接,而且不会浪费资源绘制看不见的元素。

方案2:用透明Patch占位(保持列表长度一致)

如果你需要self.patches的长度和my_list严格对应,每个位置都有一个Patch对象(哪怕是“空”的),可以创建完全透明的矩形来占位——它的位置和尺寸和正常Patch一致,但完全不可见:

fig = plt.figure()
ax = plt.axes()
self.patches = []
for i, val in enumerate(my_list):
    if val == 1:
        patch = plt.Rectangle((i, 0), 0.9, 1, angle=0.0, facecolor='r', edgecolor='w', linewidth='2.0', animated=False)
    else:
        # 透明矩形,相当于空Patch但保持位置对应
        patch = plt.Rectangle((i, 0), 0.9, 1, facecolor='none', edgecolor='none', alpha=0)
    self.patches.append(patch)
    ax.add_patch(patch)

这里通过facecolor='none'、edgecolor='none'和alpha=0让Patch完全透明,既占位又不会显示出来,完美匹配你的需求。

内容的提问来源于stack exchange,提问作者DJTS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:32:41