使用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
相关产品推荐
相关产品推荐

