Matplotlib:带有平方 imshow 的子图高度

Matplotlib: Subplot heights with squared imshow

我想绘制一个三面板图,上面有一个 imshow,下面有另外两个图。我的 imshow 具有相同的 x 和 y 维度,即。是平方的。其他两个图具有相同的 x 维度,因此它们可以共享 x 轴。但是,如何指定所有三个面板具有相同的宽度?

这是我的代码

import matplotlib.pyplot as plt

x = np.linspace(0,100,20)
y = np.sin(x)
z = np.random.rand(100,100)

fig, (ax, ax2, ax3) = plt.subplots(nrows=3, sharex=True, figsize=(10,10), gridspec_kw={"height_ratios": [2,1,1]})

# "main" plot
ax.imshow(z)

# accessory plot #1
ax2.plot(x, y)
ax2.set_xlim(0,99)

# accessory plot #2
ax3.plot(x*2, y)

plt.show()

我不明白这里的行为,为什么我的 imshow 没有像下面两个面板那样的正确宽度? 我找到了一个解决方案 ,但据我了解,这只能在每一侧创建一个附加轴?

这是我当前的输出:

我希望它看起来像这样:

布局绝对是 matplotlib 可以使用的东西。发生的事情是你有一个正方形图形,height_ratios=[2, 1, 1]:第一个轴(你绘制图像的地方)的高度是其他两个轴的两倍。但是你绘制的图像也是正方形的,所以它使用了所有可用的高度,而它在水平方向上有“白色”space。

试着玩 figsize,也许 height_ratios,像这样:

fig, (ax, ax2, ax3) = plt.subplots(nrows=3, sharex=True, figsize=(6,12), gridspec_kw={"height_ratios": [4,1,1]})