关于Matplotlib中add_subplot元组参数的困惑及报错原因咨询
Matplotlib add_subplot 元组参数解析与报错原因说明
一、add_subplot(2,2,(1,2))中元组的含义
当调用fig.add_subplot(nrows, ncols, pos)时,第三个参数如果是元组(a,b),作用是让子图占据从第a个到第b个网格位置——网格位置是按行优先规则编号的:先从左到右排满一行,再排下一行。
以你代码里的2行2列网格为例,位置编号为:
- 1:第一行左侧
- 2:第一行右侧
- 3:第二行左侧
- 4:第二行右侧
所以(1,2)表示子图同时占据第1和第2个位置,也就是把第一行的两个格子合并成一个宽幅子图,这就是你代码里第一个图能占满整个第一行的原因。
二、add_subplot(2,2,(3,2))报错的原因
出现IndexError: GridSpec slice would result in no space allocated for subplot错误,核心原因有两点:
- 编号顺序颠倒:元组里的两个数字必须满足
第一个数 ≤ 第二个数,你写的(3,2)是从3到2,顺序完全反了,Matplotlib无法识别出有效的连续网格范围。 - 非连续位置无法合并:就算你改成
(2,3)也不行——2是第一行右侧,3是第二行左侧,这两个位置在网格里不连续,没法合并成一个子图。只有同一行或同一列的连续位置才能用这种方式合并,比如(3,4)(第二行两个连续位置)、如果是3行2列网格,(1,5)(第一列三个连续位置)等。
你的代码布局逻辑(为什么能正常运行)
你的代码布局是完全合理的:
add_subplot(2,2,(1,2))合并第一行两个位置,生成跨列的子图add_subplot(223)对应第二行左侧的位置(编号3)add_subplot(2,2,4)对应第二行右侧的位置(编号4)
所以代码能正常渲染出预期的子图布局。
内容的提问来源于stack exchange,提问作者Slartibartfast
相关产品推荐
相关产品推荐

