Matplotlib子图轴未对齐:如何对齐轴并消除底部空白?
解决Matplotlib子图轴对齐与底部空白问题
问题根源
imshow默认以**等宽高比(aspect='equal')**渲染图像,当两个图像高度不同时,子图默认的高度分配会导致轴无法对齐;强行设置固定figsize会因图像与画布比例不匹配,产生多余空白。
两种可行解决方案
方案1:按图像尺寸分配子图高度(推荐,保留图像比例)
获取两个数组的形状,计算高度比例,在创建子图时通过gridspec_kw参数分配对应高度,再配合匹配图像尺寸的figsize,既能对齐轴又无多余空白:
import matplotlib.pyplot as plt import numpy as np # 替换为你的实际数组 np_source = np.random.rand(10, 8) # 示例:高度10,宽度8 achse = np.random.rand(3, 8) # 示例:高度3,宽度8 # 获取图像的高宽 h1, w1 = np_source.shape h2, w2 = achse.shape # 创建子图时指定高度比例,同时设置适配的画布尺寸 fig, (ax1, ax2) = plt.subplots( 2, 1, sharex=True, gridspec_kw={'height_ratios': [h1, h2]}, # 按图像高度分配子图高度 figsize=(w1 * 0.8, (h1 + h2) * 0.8) # 画布尺寸匹配图像总尺寸,系数可按需调整 ) plt.subplots_adjust(hspace=0.2) # 绘制图像及设置轴属性 ax1.imshow(np_source, cmap='binary') ax1.set_ylabel('Segmentiertes Bild') ax1.xaxis.set_major_locator(plt.MultipleLocator(1)) ax1.yaxis.set_major_locator(plt.MultipleLocator(1)) ax2.imshow(achse, cmap='binary') ax2.set_ylabel('Achse') ax2.xaxis.set_major_locator(plt.MultipleLocator(1)) ax2.yaxis.set_major_locator(plt.MultipleLocator(1)) # 添加网格 ax1.grid(color='dimgrey', which="both", linewidth=1) ax2.grid(color='dimgrey', which="both", linewidth=1) plt.show()
方案2:自适应子图尺寸(简单,但会拉伸图像)
如果对图像原始比例要求不高,可以将imshow的aspect参数设为'auto',让图像自适应子图尺寸,轴会自动对齐:
# 修改两处imshow代码即可 ax1.imshow(np_source, cmap='binary', aspect='auto') ax2.imshow(achse, cmap='binary', aspect='auto')
说明
- 方案1严格保留图像原始比例,子图高度与图像高度匹配,完全解决轴对齐和空白问题;
- 方案2操作简单,但会改变图像宽高比,适合对比例要求低的场景。
内容的提问来源于stack exchange,提问作者Standard
相关产品推荐
相关产品推荐

