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列布局正常运行效果参考

内容的提问来源于stack exchange,提问作者catlean
相关产品推荐
相关产品推荐

