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

