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

Matplotlib中sharey='row'与sharey=True的差异及多子图轴共享问题

让我一步步帮你解决这个问题,先理清楚参数差异,再修正你的子图设置:

先搞清楚sharey=True和sharey='row'的核心差异
  • sharey=True:整个画布上所有子图共享同一个Y轴,不管是行还是列。只要其中一个子图的Y轴范围变化,所有子图都会跟着变。如果你的三个因变量Y1/Y2/Y3数值范围差异很大,用这个参数会导致其中某些子图的曲线被压缩到几乎看不到。
  • sharey='row':只有同一行的子图共享Y轴,不同行的Y轴完全独立。这正好匹配你的需求——同一因变量(同一行)的不同案例共享Y轴,不同因变量(不同行)可以有各自的Y轴范围。
针对你的需求修正子图创建代码

你的需求是:

  1. 案例i到i+1(同一行的不同列)共享Y轴 → 用sharey='row'
  2. 同一案例i(同一列的不同行)共享X轴 → 用sharex='col'

另外注意adjustable='box-forced'已经被matplotlib弃用了,换成adjustable='box'配合aspect='equal'就能保证子图是正方形。修正后的创建代码:

fig, axes = plt.subplots(nrows=3, ncols=4, 
                         sharex='col', sharey='row',
                         subplot_kw=dict(adjustable='box', aspect='equal'))
解决你遇到的Y轴范围被覆盖的问题

你之前用sharey=True时,所有子图共用一个Y轴。当你绘制Y2的时候,matplotlib会自动调整Y轴范围来容纳Y2的所有数据,这就覆盖了你之前给Y1子图设置的ylim。

换成sharey='row'后,Y1所在的第一行和Y2所在的第二行Y轴是独立的——你给第一行设置的ylim只会作用于第一行的4个案例子图,绘制Y2时完全不会影响它,完美解决冲突。

完整示例代码
import matplotlib.pyplot as plt

# 模拟你的数据结构:X是共用自变量,Y1/Y2/Y3各有4个案例的数据
X = [1, 2, 3, 4]
Y1_case = [-941.238, -941.236, -941.233, -941.229]
Y2_case = [-850.1, -850.07, -850.03, -850.0]
Y3_case = [-600.0, -599.95, -599.9, -599.85]

# 创建符合需求的子图
fig, axes = plt.subplots(nrows=3, ncols=4, 
                         sharex='col', sharey='row',
                         subplot_kw=dict(adjustable='box', aspect='equal'))

# 绘制Y1的4个案例
for col_idx in range(4):
    axes[0][col_idx].plot(X, [Y1_case[col_idx]]*len(X))  # 替换成你的实际绘图逻辑
# 设置Y1行的Y轴范围,整行都会生效
axes[0][0].set_ylim(bottom=-941.238, top=-941.229)

# 绘制Y2的4个案例,不会影响Y1的Y轴
for col_idx in range(4):
    axes[1][col_idx].plot(X, [Y2_case[col_idx]]*len(X))

# 绘制Y3的4个案例
for col_idx in range(4):
    axes[2][col_idx].plot(X, [Y3_case[col_idx]]*len(X))

# 自动调整子图间距,避免标签重叠
plt.tight_layout()
plt.show()

内容的提问来源于stack exchange,提问作者DavidC.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:17:07