为何ax1.fill()行触发IndexError: list index out of range错误?
为何ax1.fill()行触发IndexError: list index out of range错误?
我来帮你拆解这个报错的核心原因,先看代码里的关键问题:
核心问题:索引变量错误/越界
看你代码里的两处颜色索引:
- 绘制等高线时你用的是
colors[I](大写的I) - 但在填充剩余区域的
ax1.fill行,你写的是colors[i](小写的i)
这个小写的i在当前代码片段里没有被正确定义或使用:
- 如果你是笔误把大写
I写成了小写i,而I本身是合法的索引(在colors列表的长度范围内),那修正变量名就能解决; - 如果
i是你上下文里的其他变量,但这个变量的数值超过了colors列表的长度,就会触发IndexError: list index out of range——比如colors只有3个元素,但i的值是5,自然会越界。
快速修正方案
方案1:修正笔误(最可能的原因)
如果你本来想沿用之前的I(比如外层有for I in range(len(colors))的循环),直接把ax1.fill里的i改成I即可:
ax1.fill(remaining_theta, remaining_r, color=colors[I], alpha=0.3, zorder=2)
方案2:确保索引与列表长度匹配
如果i是你想在contour_paths循环里使用的索引,改用enumerate来遍历,同时保证colors的长度不小于contour_paths的数量:
for idx, path in enumerate(contour_paths): # 中间的mask生成、剩余数据提取逻辑不变 ax1.fill(remaining_theta, remaining_r, color=colors[idx], alpha=0.3, zorder=2)
注意:如果len(contour_paths) > len(colors),还是会触发越界错误,这时候需要补充colors的元素,或者用循环取模的方式(比如colors[idx % len(colors)])来避免越界。
额外提示:你的mask生成逻辑有优化空间
当前你遍历每个网格点去匹配等高线顶点的方式不仅效率极低,还可能因为浮点数精度问题出现误判/漏判。其实可以利用Matplotlib路径的contains_points方法直接生成mask,比如:
# 生成网格点的坐标数组 grid_points = np.column_stack([combined_theta.ravel(), combined_r.ravel()]) # 判断每个网格点是否在等高线路径内部/外部 mask = ~path.contains_points(grid_points) mask = mask.reshape(combined_theta.shape)
这样能更高效准确地生成你需要的mask,避免嵌套循环的性能问题。
备注:内容来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

