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

使用sharex与imshow垂直堆叠图像时宽度不一致的解决方法

问题描述

背景

拥有图像的x,y和x,z投影,希望将这两张图像垂直堆叠且保持宽度一致。

尝试方案

编写了如下代码:

import numpy as np
import matplotlib.pyplot as plt

N1, N2 = 256, 512
table1 = np.random.rand(N1, N1)
table2 = np.random.rand(N1, N2)

f, axes = plt.subplots(2,sharex=True)
f.subplots_adjust(hspace=0,wspace=0)                                                                                                            
axes[0].imshow(table1.T,extent = [0, N1, 0, N1])
axes[1].imshow(table2.T,extent = [0, N1, 0, N2])

异常结果

尽管axes[0]和axes[1]的X范围、x轴像素数相同,且已设置sharex=True,但生成的两张图宽度并不一致,第二张图宽度更小。

问题诉求

如何垂直堆叠x范围和x轴像素数相同,但y轴像素数可不同的图像,同时保留图像的宽高比?

排除方案说明

不能使用aspect='auto',因为该参数会让两张图高度相同,拉伸图像,无法保留原有宽高比。


解决方案

核心是让子图高度比例匹配各自图像的y维度尺寸,同时保留imshow默认的aspect='equal'来维持宽高比,具体实现如下:

修改后的代码:

import numpy as np
import matplotlib.pyplot as plt

N1, N2 = 256, 512
table1 = np.random.rand(N1, N1)
table2 = np.random.rand(N1, N2)

# 按图像y轴像素数设置子图高度比例
f, axes = plt.subplots(2, sharex=True, gridspec_kw={'height_ratios': [N1, N2]})
f.subplots_adjust(hspace=0, wspace=0)

axes[0].imshow(table1.T, extent=[0, N1, 0, N1])
axes[1].imshow(table2.T, extent=[0, N1, 0, N2])

# 隐藏上方子图的x轴刻度,优化视觉连贯性
axes[0].set_xticks([])

plt.show()

原理说明

  • gridspec_kw={'height_ratios': [N1, N2]} 让两个子图的高度按图像y轴像素数比例分配,配合aspect='equal',两张图的宽度会自动对齐,同时各自的宽高比完全保留。
  • sharex=True 确保x轴范围和刻度完全一致,避免错位。
  • 隐藏上方子图的x轴刻度是可选优化,让堆叠后的图像布局更紧凑连贯。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 21:53:19