为什么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
相关产品推荐
相关产品推荐

