Чтобы настроить размеры экземпляра осей, вам необходимо использовать метод set_position () . Это относится и к subplotAxes. Чтобы получить текущую позицию / размеры оси, используйте метод get_position () , который возвращает экземпляр Bbox. Для меня концептуально проще просто взаимодействовать с позицией, то есть [слева, снизу, справа, сверху]. Чтобы получить доступ к этой информации из Bbox, свойство bounds .
Здесь я применяю эти методы к чему-то похожему на ваш пример выше:
import matplotlib.pyplot as plt
import numpy as np
x,y = np.random.rand(2,10)
img = np.random.rand(10,10)
fig = plt.figure()
ax1 = fig.add_subplot(221)
im = ax1.imshow(img,extent=[0,1,0,1])
plt.colorbar(im)
ax2 = fig.add_subplot(222)
im = ax2.imshow(img,extent=[0,1,0,1])
plt.colorbar(im)
ax3 = fig.add_subplot(223)
ax3.plot(x,y)
ax3.axis([0,1,0,1])
ax4 = fig.add_subplot(224)
im = ax4.imshow(img,extent=[0,1,0,1])
plt.colorbar(im)
pos4 = ax4.get_position().bounds
pos1 = ax1.get_position().bounds
# set the x limits (left and right) to first axes limits
# set the y limits (bottom and top) to the last axes limits
newpos = [pos1[0],pos4[1],pos1[2],pos4[3]]
ax3.set_position(newpos)
plt.show()
Вам может показаться, что эти два графика не совсем одинаковы (в моем рендеринге позиция left или xmin не совсем правильная), поэтому не стесняйтесь регулировать позицию, пока не получите желаемый эффект.