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

Matplotlib中如何让两个子图坐标轴长度相等(呈正方形)

让Matplotlib子图变成正方形的解决方案

嗨,我懂你遇到的困扰了——明明用了plt.axis('scaled'),但两个子图还是没法变成正方形(x轴和y轴显示长度相等)对吧?别着急,我来给你几个实用的方法,亲测有效:

方法1:用Axes对象设置等比例(推荐)

直接用subplots创建子图对象,然后给每个子图设置set_aspect('equal', adjustable='box'),这样能精准控制每个轴的比例,还能让matplotlib自动调整子图形状来满足正方形要求。

示例代码:

import matplotlib.pyplot as plt

# 假设你的数据是这些(替换成你自己的x,y,u,v)
x = [1, 3, 5, 7]
y = [2, 6, 10, 14]
u = [0, 0.3, 0.7, 1]
v = [0, 0.5, 0.8, 1]

# 创建1行2列的子图
fig, (ax1, ax2) = plt.subplots(1, 2)

# 第一个子图设置
ax1.plot(x, y)
ax1.set_aspect('equal', adjustable='box')  # 强制x/y单位长度显示一致,同时调整子图为正方形

# 第二个子图设置
ax2.plot(u, v)
ax2.set_aspect('equal', adjustable='box')

# 自动调整布局,避免标签重叠
plt.tight_layout()
plt.show()

方法2:直接用plt.axis('equal')

如果你习惯用全局的plt函数,把scaled换成equal就行——equal是强制x轴和y轴的单位长度在屏幕上完全相等,而scaled只是让轴的比例匹配数据范围,这就是为什么之前没生效的原因!

示例代码:

import matplotlib.pyplot as plt

# 你的数据
x = [1, 3, 5, 7]
y = [2, 6, 10, 14]
u = [0, 0.3, 0.7, 1]
v = [0, 0.5, 0.8, 1]

plt.subplot(1, 2, 1)
plt.plot(x, y)
plt.axis('equal')  # 替换scaled为equal

plt.subplot(1, 2, 2)
plt.plot(u, v)
plt.axis('equal')

plt.tight_layout()
plt.show()

额外小技巧:固定子图物理尺寸

如果想让子图的物理形状严格是正方形,可以在创建子图时指定figsize,比如1行2列的话,把宽度设为高度的2倍(比如figsize=(8,4)),这样每个子图的宽度是4,高度是4,天然就是正方形,再配合上面的比例设置,效果更完美:

fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))

内容的提问来源于stack exchange,提问作者Gábor Erdős

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:01:31