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

