Matplotlib绘制子图箱线图触发IndexError:数组维度索引错误
问题原因及解决方法
核心错误点
- 子图索引误用:
plt.subplots(1, 2)创建的是1行2列的子图布局,返回的axs是一维数组,你用axs[0, 0]和axs[0, 1]这种二维索引方式,必然触发维度不匹配的报错。 - 箱线图绘制方式错误:子图模式下,应该调用子图对象的
boxplot()方法,而非全局的plt.boxplot(),否则会打乱子图布局。 - 未定义变量问题:代码中
array2 = np.zeros((len(repeats), len(correl)))里的correl未定义,推测是笔误,应该替换为cols。
修正后的完整代码
import numpy as np import matplotlib.pyplot as plt cols = [0, 1, 2, 3, 4] repeats = np.linspace(0, 49, 50) # 修正未定义变量问题,统一用cols array1 = np.zeros((len(repeats), len(cols))) array2 = np.zeros((len(repeats), len(cols))) # 模拟数据填充(实际使用时替换为你的数据生成逻辑) for i in range(len(cols)): for j in range(len(repeats)): array1[j, i] = np.random.normal(loc=i*2, scale=1) array2[j, i] = np.random.normal(loc=i*2 + 1, scale=1.2) # 创建1行2列的子图 fig3, axs = plt.subplots(1, 2, figsize=(12, 6)) # 在第一个子图绘制array1的箱线图 axs[0].boxplot(array1, labels=cols) axs[0].set_title('数组1的箱线图') axs[0].set_xlabel('列索引') axs[0].set_ylabel('数值') # 在第二个子图绘制array2的箱线图 axs[1].boxplot(array2, labels=cols) axs[1].set_title('数组2的箱线图') axs[1].set_xlabel('列索引') axs[1].set_ylabel('数值') plt.tight_layout() # 自动调整子图间距,避免标签重叠 plt.show()
关键说明
- 当
plt.subplots()的行/列数为1时,返回的axs是一维数组,直接用axs[0]、axs[1]索引即可;只有多行多列布局(比如2×2),才需要用axs[row_idx, col_idx]的二维索引。 - Matplotlib的
boxplot()默认会把二维数组的每一列作为一个数据集绘制箱体,正好符合你“每列对应一个箱体”的需求,无需额外转置数据。
内容的提问来源于stack exchange,提问作者soapeater
相关产品推荐
相关产品推荐

