如何对齐拉近子图布局?消除空轴并实现nxn矩阵及行列和绘图
解决矩阵与行和/列和子图对齐及空轴问题
可以通过两种方式实现需求:一种是用GridSpec精准控制布局,另一种是在原有代码基础上调整子图位置并删除空轴。
方法一:使用GridSpec(推荐,布局更可控)
这种方式直接定义所需的子图布局,避免生成空轴,同时通过比例设置让子图尺寸对齐,缩小间距:
import numpy as np import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec # 生成数据 data = np.random.randn(5, 5) row_sum = data.sum(axis=1).reshape(-1, 1) col_sum = data.sum(axis=0).reshape(1, -1) # 创建网格布局:2行2列,主图与行和/列和的尺寸比例设为5:1(匹配矩阵维度) # wspace和hspace控制子图间的水平/垂直间距,设为极小值拉近距离 gs = GridSpec(2, 2, width_ratios=[5, 1], height_ratios=[5, 1], wspace=0.05, hspace=0.05) fig = plt.figure() # 添加三个子图 ax_main = fig.add_subplot(gs[0, 0]) # 主矩阵图 ax_row = fig.add_subplot(gs[0, 1]) # 行和图 ax_col = fig.add_subplot(gs[1, 0]) # 列和图 # 绘制图像 im_main = ax_main.imshow(data) ax_row.imshow(row_sum) ax_col.imshow(col_sum) # 隐藏所有刻度,让布局更整洁 ax_main.set_xticks([]) ax_main.set_yticks([]) ax_row.set_xticks([]) ax_row.set_yticks([]) ax_col.set_xticks([]) ax_col.set_yticks([]) # 可选:添加统一的颜色条 fig.colorbar(im_main, ax=[ax_main, ax_row, ax_col], shrink=0.8) plt.show()
方法二:修改原有代码
如果想基于你已写的代码调整,可按以下步骤操作:
import numpy as np import matplotlib.pyplot as plt data = np.random.randn(5, 5) fig, axes = plt.subplots(2, 2) # 绘制三个子图 axes[0, 0].imshow(data) axes[0, 1].imshow(data.sum(axis=1).reshape(-1, 1)) axes[1, 0].imshow(data.sum(axis=0).reshape(1, -1)) # 删除右下角的空轴 axes[1, 1].remove() # 缩小子图间的水平/垂直间距 plt.subplots_adjust(wspace=0.05, hspace=0.05) # 调整行和、列和子图的位置,与主图对齐 pos_main = axes[0, 0].get_position() # 设置行和子图的位置:与主图同高度,宽度缩小 axes[0, 1].set_position([pos_main.x1 + 0.01, pos_main.y0, 0.1*pos_main.width, pos_main.height]) # 设置列和子图的位置:与主图同宽度,高度缩小 axes[1, 0].set_position([pos_main.x0, pos_main.y0 - 0.01, pos_main.width, 0.1*pos_main.height]) # 隐藏所有刻度优化显示 for ax in axes.flat: if ax.get_visible(): ax.set_xticks([]) ax.set_yticks([]) plt.show()
关键调整点说明
- 删除空轴:调用
axes[1,1].remove()直接移除不需要的子图 - 缩小间距:通过
plt.subplots_adjust()的wspace和hspace参数减小子图间空隙 - 尺寸对齐:要么用
GridSpec的比例参数直接定义,要么手动获取主图位置后调整行和/列和子图的位置与尺寸,确保行和子图高度与主图一致,列和子图宽度与主图一致
内容的提问来源于stack exchange,提问作者ERed
相关产品推荐
相关产品推荐

