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

使用df.plot绘制多子图箱线图时出现IndexError错误如何解决

错误含义、触发原因及修复方案

错误含义

报错最终触发的是IndexError: index 0 is out of bounds for axis 0 with size 0,意思是程序尝试向长度为0的空数组写入索引为0的元素,超出了数组的边界。从报错栈可以看出问题出在pandas绘图模块存储箱线图返回结果的逻辑环节。

触发原因

  • 第一个诱因:Sonar数据集一共61列,最后一列是分类标签(字符串类型的岩矿/水雷标记),属于非数值列,绘制箱线图时pandas会自动跳过该列,实际需要绘制的子图数量为60个。
  • 第二个核心诱因:你设置的子图布局layout=(8,8)总共有64个位置,多于实际需要绘制的60张子图。该场景在pandas 1.x版本中存在已知bug:绘图模块初始化返回结果的长度时没有适配实际生成的子图数量,导致返回的Series为空,写入第一个子图结果时就触发越界错误。

修复方案

方案1:适配子图布局

先过滤非数值列,再将子图布局调整为刚好匹配实际绘图数量的规格,比如60列可以用10行6列的布局,代码如下:

# 先提取所有数值列,自动跳过标签列
df_numeric = df.select_dtypes(include='number')
# 绘制箱线图
df_numeric.plot(kind='box', subplots=True, layout=(10,6),
                sharex=False, sharey=False, figsize=(12, 18))

方案2:指定返回类型避开bug

不需要调整布局,只要在绘图参数中加入return_type='axes',强制让绘图函数返回子图轴对象数组,跳过会触发bug的Series返回逻辑即可:

df.plot(kind='box', subplots=True, layout=(8,8),
        sharex=False, sharey=False, figsize=(12, 12),
        return_type='axes')

方案3:升级pandas版本

该子图数量不匹配的bug已经在pandas 2.0及以上版本修复,升级pandas到最新稳定版后,原代码可以直接运行,多余的子图位置会留空不会触发报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 10:24:01