如何强制Matplotlib子图中同尺寸图像轴显示一致?
解决Matplotlib子图尺寸对齐问题
我来帮你搞定这个子图尺寸不一致的问题!首先看你给出的代码:
n=10 x = np.random.rand(n,1) y = np.random.rand(1,n) z = np.random.rand(n,n) fig, ax = plt.subplots(1, 3) ax[0].imshow(x) ax[1].imshow(z) ax[2].imshow(y)
运行后确实会出现第一个子图纵轴比中间的n×n子图宽、第三个子图横轴比中间长的问题,就像这张图显示的:
你想要的是让所有子图中尺寸为n的维度严格对齐,也就是第一个子图的纵轴和中间子图一致,第三个子图的横轴和中间子图一致,最终达到这样的效果:
下面给你两种可靠的编程实现方法:
方法一:固定比例+对齐轴范围
Matplotlib的imshow默认aspect='auto',会根据窗口拉伸子图。我们可以给每个子图设置aspect='equal',然后手动对齐轴范围来匹配中间的正方形子图:
import numpy as np import matplotlib.pyplot as plt n=10 x = np.random.rand(n,1) y = np.random.rand(1,n) z = np.random.rand(n,n) # 先设置合适的整体图尺寸,避免挤在一起 fig, ax = plt.subplots(1, 3, figsize=(10, 3)) # 处理中间的正方形子图,固定等比例 ax[1].imshow(z) ax[1].set_aspect('equal') # 第一个子图:n行1列,让横轴范围和中间子图的纵轴范围对齐 ax[0].imshow(x) ax[0].set_aspect('equal') ax[0].set_xlim(ax[1].get_ylim()) # 第三个子图:1行n列,让纵轴范围和中间子图的横轴范围对齐 ax[2].imshow(y) ax[2].set_aspect('equal') ax[2].set_ylim(ax[1].get_xlim()) # 自动调整子图间距 plt.tight_layout() plt.show()
方法二:用set_box_aspect()精准控制宽高比
如果你用的是Matplotlib 3.3及以上版本,推荐用set_box_aspect()直接设置子图的宽高比,逻辑更清晰:
import numpy as np import matplotlib.pyplot as plt n=10 x = np.random.rand(n,1) y = np.random.rand(1,n) z = np.random.rand(n,n) fig, ax = plt.subplots(1, 3, figsize=(10, 3)) # 中间子图是正方形,宽高比设为1 ax[1].imshow(z) ax[1].set_box_aspect(1) # 第一个子图:n行1列,高度是宽度的n倍,所以宽高比为n/1 ax[0].imshow(x) ax[0].set_box_aspect(n/1) # 第三个子图:1行n列,高度是宽度的1/n倍,所以宽高比为1/n ax[2].imshow(y) ax[2].set_box_aspect(1/n) plt.tight_layout() plt.show()
这两种方法都能让子图的对应维度严格对齐,不管怎么调整窗口大小都不会变形,完全符合你的需求。
内容的提问来源于stack exchange,提问作者dkv
相关产品推荐
相关产品推荐

