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

如何强制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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:25:56