如何调整imshow子图比例,保持Y轴恒定且X轴匹配数组宽度?
解决imshow绘制多数组时的自定义纵横比匹配问题
要实现子图X轴长度与数组水平尺寸成比例的需求,核心是结合子图宽度比例设置和imshow的aspect参数,以下是最直接的解决方案:
方法:利用subplots的width_ratios参数
因为所有数组的垂直尺寸相同(均为100),只需让子图的物理宽度比例等于数组的水平尺寸比例(200:300=2:3),再配合aspect='auto'让图像自适应子图尺寸即可,非整数比例也完全适用。
完整代码示例
import matplotlib.pyplot as plt import numpy as np # 创建测试数组 A = np.random.rand(100, 200) B = np.random.rand(100, 300) # 按数组水平维度比例设置子图宽度 fig, (ax1, ax2) = plt.subplots(nrows=1, ncols=2, figsize=(10, 3), width_ratios=[200, 300]) # 绘制图像,aspect='auto'让图像填满子图,保证比例匹配 ax1.imshow(A, aspect='auto') ax1.set_title('Array A (100×200)') ax2.imshow(B, aspect='auto') ax2.set_title('Array B (100×300)') plt.tight_layout() plt.show()
原理说明
width_ratios=[200, 300]直接指定两个子图的物理宽度比为2:3,完全匹配数组的水平尺寸比例;aspect='auto'会让imshow忽略数据坐标的纵横比约束,自动拉伸图像填满整个子图,这样子图的物理尺寸比例就直接反映在图像的显示比例上;- 若需要固定
aspect为shape[1]/shape[0](比如A的aspect=2,B的aspect=3),只需将aspect='auto'替换为对应的计算值,同时保持width_ratios的设置,效果一致:ax1.imshow(A, aspect=A.shape[1]/A.shape[0]) ax2.imshow(B, aspect=B.shape[1]/B.shape[0])
内容的提问来源于stack exchange,提问作者Bastien
相关产品推荐
相关产品推荐

