如何用Matplotlib将主位图与多张子图阵列并排绘制
主位图与小图阵列并排展示解决方案
你之前的问题出在创建了两个独立的Figure窗口,自然没法实现并排布局。要把两部分放在同一个Figure里,用网格布局划分区域就能解决,下面是修改后的完整代码:
import matplotlib.pyplot as plt import matplotlib.gridspec as gridspec from math import sqrt, ceil import numpy as np # ---------------------- 替换成你的实际数据 ---------------------- # 模拟测试数据(实际使用时删除这部分,导入你的真实数据) im = np.random.rand(200, 200) # 主位图数据 indices = list(range(25)) # 小图索引列表 S = 20 # 小图的边长 val = [np.random.rand(S*S) for _ in indices] # 小图扁平化数据 tiles_dictionary = {i: f"Tile {i+1}" for i in indices} # 小图标题字典 # -------------------------------------------------------------- # 计算小图网格的行列数 columns = int(sqrt(len(indices))) rows = int(ceil(len(indices) / columns)) # 创建整体画布,用GridSpec划分布局:行数=小图行数,列数=小图列数+1(左边留一列放主图) fig = plt.figure(figsize=(14, 8)) gs = gridspec.GridSpec(rows, columns + 1) # 绘制左侧主位图:占满所有行的第0列 ax_main = fig.add_subplot(gs[:, 0]) ax_main.imshow(im, cmap='gray', vmin=0, vmax=1) ax_main.set_title("主位图") ax_main.axis('off') # 不需要坐标轴可关闭 # 绘制右侧小图阵列 for i in range(len(indices)): # 计算当前小图在网格中的位置 row_idx = i // columns col_idx = i % columns + 1 # 偏移1列,避开主图的位置 ax = fig.add_subplot(gs[row_idx, col_idx]) # 绘制小图 ax.imshow(val[i].reshape(S, S), cmap='gray', vmin=0, vmax=1) ax.set_title(f"Q: {tiles_dictionary[i]}", fontsize=10) ax.axis('off') # 关闭小图的坐标轴,更整洁 # 自动调整布局,避免标题、图像重叠 plt.tight_layout() plt.show()
关键要点
- 用
GridSpec灵活划分画布区域,左侧主图占满所有行的第一列,右侧小图在剩余列中按网格排列 - 所有绘图操作都在同一个
Figure中完成,避免创建多个独立窗口 - 最后调用
tight_layout()自动调整元素间距,解决重叠问题
内容的提问来源于stack exchange,提问作者barginGarden
相关产品推荐
相关产品推荐

