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

matplotlib设置2行1列subplots时出现数组索引过多报错

报错核心原因

matplotlib中plt.subplots()返回的子图对象数组axs的维度,和设置的子图行列布局直接绑定,调整布局后没有对应修改子图的索引方式,就会触发报错:

  • 布局为多行多列(如2行2列)时,axs是二维数组,需要用axs[行索引, 列索引]的二维格式访问子图,这也是2行2列布局能正常运行的原因
  • 布局为单行/单列(如2行1列、1行3列)时,axs是一维数组,只需要传入一个索引值、用axs[序号]的一维格式访问,此时如果还沿用二维双索引写法,就会抛出too many indices for array、'AxesSubplot' object is not subscriptable的错误
  • 布局为1行1列(单个子图)时,axs直接是单个子图对象,不需要加索引

另外贴出的复现代码里还存在索引越界问题:2行1列的子图行索引只有0、1两个有效值,列索引只有0一个有效值,写axs[0,1]、axs[2,1]本身就超出了数组范围。

修复方案

方案1:匹配布局调整索引写法

针对2行1列的布局,把二维索引改成一维索引即可,示例代码:

# 折线图场景
fig, axs = plt.subplots(nrows=2, ncols=1, figsize=(16,8), gridspec_kw={'hspace': 0.2, 'wspace': 0.1})
axs[0].plot(adj_close['SOL-USD'])
axs[0].set_title('SOL')
axs[1].plot(adj_close['ETH-USD'])
axs[1].set_title('ETH')

plt.show()
# 直方图场景
fig, axs = plt.subplots(2,1,figsize=(16,8),gridspec_kw ={'hspace': 0.2, 'wspace': 0.1})
axs[0].hist(returns['SOL-USD'], bins=50, range=(-0.2, 0.2))
axs[0].set_title('SOL')
axs[1].hist(returns['ETH-USD'], bins=50, range=(-0.2, 0.2))
axs[1].set_title('ETH')

plt.show()

方案2:固定索引习惯,不随布局改动

如果不想每次调整布局都修改索引写法,可以在调用plt.subplots()时传入参数squeeze=False,强制让axs始终返回二维数组,不管布局是几行几列,都统一用axs[行索引, 列索引]的格式访问:

# 2行1列布局加squeeze=False后,和2行2列索引写法完全一致
fig, axs = plt.subplots(nrows=2, ncols=1, figsize=(16,8), squeeze=False, gridspec_kw={'hspace': 0.2, 'wspace': 0.1})
axs[0,0].plot(adj_close['SOL-USD'])
axs[0,0].set_title('SOL')
axs[1,0].plot(adj_close['ETH-USD'])
axs[1,0].set_title('ETH')

plt.show()
2行2列布局正常运行效果参考

2行2列subplot运行效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:36:28