如何在Matplotlib中创建高度匹配z范围的并列子图?
解决Matplotlib并列子图高度匹配与空白消除问题
核心思路是通过gridspec设置子图高度比例匹配各自z范围的最大值,同时手动统一y轴刻度规则,既保证刻度缩放一致,又消除不必要的空白区域。以下是简便实现代码:
import matplotlib.pyplot as plt import numpy as np # 生成模拟数据 z1 = np.linspace(0, 1.4, 20) z2 = np.linspace(0, 1.1, 20) z3 = np.linspace(0, 1.0, 20) data1 = np.exp(-z1) data2 = np.exp(-z2) data3 = np.exp(-z3) # 计算子图高度比例,对应各模拟的z最大值 z_maxes = [1.4, 1.1, 1.0] height_ratios = [zm / max(z_maxes) for zm in z_maxes] # 创建gridspec布局,1行3列,宽度一致,高度按比例分配 fig = plt.figure(figsize=(10, 4)) gs = fig.add_gridspec(1, 3, width_ratios=[1,1,1], height_ratios=height_ratios) # 第一个子图 ax1 = fig.add_subplot(gs[0]) ax1.plot(data1, z1, c='k') ax1.set_ylim(0, z_maxes[0]) ax1.set_yticks(np.arange(0, z_maxes[0]+0.2, 0.2)) # 统一刻度间隔,保证缩放一致 ax1.set_ylabel('z') ax1.set_xlabel('物理量') # 第二个子图 ax2 = fig.add_subplot(gs[1]) ax2.plot(data2, z2, c='k') ax2.set_ylim(0, z_maxes[1]) ax2.set_yticks(np.arange(0, z_maxes[1]+0.2, 0.2)) ax2.set_xlabel('物理量') ax2.tick_params(axis='y', left=False, labelleft=False) # 隐藏左侧刻度,避免重复 # 第三个子图 ax3 = fig.add_subplot(gs[2]) ax3.plot(data3, z3, c='k') ax3.set_ylim(0, z_maxes[2]) ax3.set_yticks(np.arange(0, z_maxes[2]+0.2, 0.2)) ax3.set_xlabel('物理量') ax3.tick_params(axis='y', left=False, labelleft=False) # 自动调整布局,消除间距空白 fig.tight_layout() plt.show()
关键说明
- 高度比例设置:
height_ratios基于各模拟的z最大值计算,让子图高度与z范围成正比,从根源消除空白。 - 刻度统一:手动设置相同间隔的y轴刻度,保证三个子图的z轴缩放视觉一致,替代
sharey=True的强制等范围逻辑。 - 冗余刻度隐藏:关闭第二、三子图的左侧y轴刻度,避免视觉干扰。
内容的提问来源于stack exchange,提问作者AceTorterra1
相关产品推荐
相关产品推荐

