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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:12:26