使用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
相关产品推荐
相关产品推荐

