You need to enable JavaScript to run this app. 如何调整subplot中单张子图的长度,使带colorbar的子图与其他子图尺寸一致
优惠活动
大模型
产品
解决方案
定价
更多

如何调整subplot中单张子图的长度,使带colorbar的子图与其他子图尺寸一致

如何调整subplot中单张子图的长度?

问题原因

出现第三张子图更短的问题,是因为直接在子图上调用plt.colorbar时,matplotlib会自动压缩该子图的空间来放置colorbar,而前两行子图没有被压缩,自然尺寸不一致。你原本的代码中用plt.subplots(3, 2)生成了3行2列共6个axes对象,前两行的第二列axes被闲置,也导致布局逻辑和预期不符。

解决方法

通过预定义网格布局,给colorbar单独留出专属位置,就不会占用语谱图的空间,三个子图的尺寸会自动对齐。示例代码如下:

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
import numpy as np

# 创建画布,开启constrained_layout自动调整间距,避免元素重叠
fig = plt.figure(constrained_layout=True)
# 定义3行2列网格,设置宽度比例让colorbar更窄,可按需调整
gs = GridSpec(3, 2, figure=fig, width_ratios=[9, 1])

# 前两个子图跨两列显示
ax1 = fig.add_subplot(gs[0, :])
ax2 = fig.add_subplot(gs[1, :])
# 第三行第一列放置语谱图
ax3 = fig.add_subplot(gs[2, 0])
# 第三行第二列预留给colorbar
cbar_ax = fig.add_subplot(gs[2, 1])

# 原有绘图逻辑不变
ax1.plot(sb['Seconds'], sb['Real'], 'dodgerblue', linewidth = 0.5)
ax2.plot(f2, np.log(P3), 'k', linewidth = 0.5)
s, freqs, bins, im = ax3.specgram(y, NFFT = N, Fs=Fs1,  cmap='jet')

# 将colorbar绘制到预留的轴上,不会压缩语谱图
fig.colorbar(im, cax=cbar_ax, orientation='vertical', pad=0.009)

如果你使用的是matplotlib 3.4及以上版本,还可以用更简洁的subplot_mosaic实现相同效果:

import matplotlib.pyplot as plt
import numpy as np

fig, axs = plt.subplot_mosaic(
    [
        ["ax1", "ax1"],
        ["ax2", "ax2"],
        ["ax3", "cbar"]
    ],
    width_ratios=[9, 1],
    constrained_layout=True
)

# 取到对应axes后绘图逻辑和上述一致
ax1 = axs["ax1"]
ax2 = axs["ax2"]
ax3 = axs["ax3"]
cbar_ax = axs["cbar"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 07:45:03