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

使用Matplotlib嵌套列表索引gridspec子图时出现异常行为

Gridspec子图索引异常:文本仅显示在最后一行的问题

问题场景

使用Matplotlib的Gridspec创建2x2子图布局时,遇到索引异常:

  • V1(创建时直接修改):在子图创建循环内调用text(),每个子图能正常显示对应行/列的标记文本;
  • V2(单独循环修改):后续单独遍历子图添加文本时,所有文本都堆叠在下方一行的子图中,无法匹配到对应的子图位置。

需要保留Gridspec的宽高比灵活性,因此不采用fig, axes=plt.subplots(2,2)的创建方式。

问题根源

问题出在子图列表axes的初始化方式:

axes=[[None]*2]*2

这种写法会生成两个引用同一子列表的行——axes[0]和axes[1]指向同一个[None, None]列表对象。后续赋值子图时,对axes[1][col]的修改会同步覆盖axes[0][col]的内容,最终两行的子图引用完全相同,全部指向最后一行创建的两个子图。因此V2循环时,所有text()调用都作用在下方行的子图上。

解决方案

将axes的初始化改为列表推导式,确保每一行都是独立的列表:

axes = [[None for _ in range(2)] for _ in range(2)]

修正后的完整代码

import matplotlib.pyplot as plt

plt.close('all')
fig = plt.figure()
gs = fig.add_gridspec(2,2)
# 使用列表推导式初始化独立的子列表
axes = [[None for _ in range(2)] for _ in range(2)]

# 创建所有子图
for col in range(2):
    for row in range(2):
        axes[row][col] = fig.add_subplot(gs[row, col])

# 单独循环添加文本,现在可正常显示在对应子图
for col in range(2):
    for row in range(2):   
        axes[row][col].text(0.5, 0.5, 'R:{} C:{}'.format(row, col))

plt.show()

内容的提问来源于Stack Exchange,提问作者Jacob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:55:26