【问题标题】:How to control colorbar position when using subplots in Matplotlib [duplicate]在 Matplotlib 中使用子图时如何控制颜色条位置 [重复]
【发布时间】:2025-12-15 17:20:03
【问题描述】:

我正在尝试使用 Matplotlib 绘制时间序列及其频谱图和相关的颜色条。

下面是一个 MCVE:

import numpy as np
import matplotlib.pyplot as plt
import scipy.signal as scignal
import random

array=np.random.random(10000)
t,f,Sxx=scignal.spectrogram(array,fs=100)

plt.subplot(211)
plt.plot(array)
plt.subplot(212)
plt.pcolormesh(Sxx)
plt.colorbar()

此代码产生下图:

但是,我希望两个子图的大小相同:

我曾想过使用 plt.colorbar(orientation='horizontal') 更改颜色条的方向,但我对结果不满意,因为子图的高度不一样。

任何帮助将不胜感激!

【问题讨论】:

    标签: python matplotlib


    【解决方案1】:

    发生这种情况的原因是plt.colorbar 创建了一个 Axes 对象,它从较低的Axes 中“窃取”了空间(这就是制作水平颜色条也会影响两个原始地块)。

    有几种方法可以解决这个问题;一种是用四个Axes创建一个Figure,将大部分空间分配给左边的,只让一个不可见:

    import numpy as np
    import matplotlib.pyplot as plt
    import scipy.signal as scignal
    import random
    
    array = np.random.random(10000)
    t, f, Sxx = scignal.spectrogram(array,fs=100)
    
    fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(5, 6), gridspec_kw={'width_ratios': [19, 1]})
    (ax1, blank), (ax2, ax_cb) = axes
    blank.set_visible(False)
    ax1.plot(array)
    m = ax2.pcolormesh(Sxx)
    fig.colorbar(m, cax=ax_cb)
    

    【讨论】:

    • 太棒了!感谢您的快速回复,gmds!您的解决方法正是我想要的!创建一个 2 x 2 网格对我有用。