Вы можете использовать макет gridspec, чтобы разместить свои подсюжеты. Хитрость заключается в том, чтобы правильно настроить параметры.Это потребует небольшого тестирования.
Здесь идея заключается в создании сетки с 4 строками и 2 столбцами.Два нижних сюжета будут охватывать оба столбца, а верхний - только последний.Там также будет пустая строка для учета дополнительного пространства, необходимого для метки x верхнего графика.

Конечно, тогда вы не должны вызывать tight_layout
, так как это снова зашифровывает все правильно установленные параметры.
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1 import make_axes_locatable
from matplotlib.gridspec import GridSpec
fig = plt.figure(figsize=(5, 8))
gs = GridSpec(nrows=4, ncols=2,height_ratios=[1.2, .1, .8, .8],
width_ratios=[.1, 1],
hspace=0.05, wspace=0.1,
left=0.05, right=0.9,
bottom=0.02, top=0.98)
ax1=fig.add_subplot(gs[0,1])
ax2=fig.add_subplot(gs[2,:])
ax3=fig.add_subplot(gs[3,:])
ax1.plot(np.random.rand(100))
ax1.set_ylabel('y-label')
ax1.set_xlabel('x-label')
im2 = ax2.imshow(np.random.random(size=(50, 100)))
ax2.axes.get_xaxis().set_ticks([])
ax2.axes.get_yaxis().set_ticks([])
divider2 = make_axes_locatable(ax2)
cax2 = divider2.append_axes("right", "5%", pad="3%")
cbar2 = plt.colorbar(im2, cax=cax2, orientation='vertical')
im3 = ax3.imshow(np.random.random(size=(50, 100)))
ax3.axes.get_xaxis().set_ticks([])
ax3.axes.get_yaxis().set_ticks([])
divider3 = make_axes_locatable(ax3)
cax3 = divider3.append_axes("right", "5%", pad="3%")
cbar3 = plt.colorbar(im3, cax=cax3, orientation='vertical')
plt.show()
