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

为什么matplotlib用GridSpec绘制的等高度图像子图高度略有差异?如何解决?

问题原因

你遇到的对齐问题是imshow默认保持像素等比例(aspect="equal")导致的。两个子图在GridSpec中分配的宽度比例是2:3,和图像本身的像素宽比(2:3)匹配,但你创建的总画布是5x5的正方形,分配给子图的实际宽度对应的高度无法刚好填充满子图的纵向空间,窄图会自动缩小高度维持像素比例,所以出现高度差。


解决方案1:保持像素比例不变(无拉伸,最推荐)

直接通过GridSpec设置子图宽度比例和图像像素宽度比例完全一致,同时调整画布尺寸适配比例,避免多余留白,两张图的像素宽高比会完全保留,高度自然对齐:

import numpy as np
import matplotlib.pyplot as plt

# 两个图像的像素高均为h,宽分别为w1、w2
h, w1, w2 = 5, 2, 3
# 按宽度比例设置画布,高度可自定义,这里设为3避免太扁
fig, (ax1, ax2) = plt.subplots(1, 2, gridspec_kw={'width_ratios': [w1, w2]}, figsize=(w1 + w2, 3))

ax1.imshow(np.random.normal(size=(h, w1)))
ax1.axis('off')
ax2.imshow(np.random.normal(size=(h, w2)))
ax2.axis('off')

plt.tight_layout()
plt.show()

解决方案2:允许图像拉伸(快速对齐)

如果不需要严格保持像素比例,直接给每个imshow调用添加aspect="auto"参数,即可强制子图填充分配的空间实现对齐:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

plt.figure(figsize=(5,5))
gridspec.GridSpec(5, 5)

# 窄图
plt.subplot2grid((5, 5), (0,0), colspan=2, rowspan=5)
plt.imshow(np.random.normal(size=(5,2)), aspect='auto')
plt.axis('off')

# 宽图
plt.subplot2grid((5, 5), (0,2), colspan=3, rowspan=5)
plt.imshow(np.random.normal(size=(5,3)), aspect='auto')
plt.axis('off')

plt.show()

内容的提问来源于stack exchange,提问作者CesiumLifeJacket

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:06:03