Matplotlib中sharey='row'与sharey=True的差异及多子图轴共享问题
让我一步步帮你解决这个问题,先理清楚参数差异,再修正你的子图设置:
sharey=True:整个画布上所有子图共享同一个Y轴,不管是行还是列。只要其中一个子图的Y轴范围变化,所有子图都会跟着变。如果你的三个因变量Y1/Y2/Y3数值范围差异很大,用这个参数会导致其中某些子图的曲线被压缩到几乎看不到。sharey='row':只有同一行的子图共享Y轴,不同行的Y轴完全独立。这正好匹配你的需求——同一因变量(同一行)的不同案例共享Y轴,不同因变量(不同行)可以有各自的Y轴范围。
针对你的需求修正子图创建代码
你的需求是:
- 案例i到i+1(同一行的不同列)共享Y轴 → 用
sharey='row' - 同一案例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.
相关产品推荐
相关产品推荐

