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
相关产品推荐
相关产品推荐

