Изменение размера/позиции подзаголовка matplotlib после создания осей

Можно ли установить размер/положение подзадачи matplotlib после создания осей? Я знаю, что могу:

import matplotlib.pyplot as plt

ax = plt.subplot(111)
ax.change_geometry(3,1,1)

чтобы поместить оси в верхнюю строку из трех. Но я хочу, чтобы оси охватывали первые две строки. Я пробовал это:

import matplotlib.gridspec as gridspec

ax = plt.subplot(111)
gs = gridspec.GridSpec(3,1)
ax.set_subplotspec(gs[0:2])

но оси все еще заполняют все окно.

Обновление для ясности Я хочу изменить положение существующего экземпляра осей, а не устанавливать его при его создании. Это связано с тем, что размер осей будет изменяться каждый раз, когда я добавляю данные (вывод данных на карту с использованием картографии). Карта может оказаться высокой и узкой, или короткой и широкой (или что-то среднее). Таким образом, решение о компоновке сетки произойдет после функции построения графика.

Ответ 1

Благодаря Молли, указывая мне в правильном направлении, у меня есть решение:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

fig = plt.figure()

ax = fig.add_subplot(111)

gs = gridspec.GridSpec(3,1)
ax.set_position(gs[0:2].get_position(fig))
ax.set_subplotspec(gs[0:2])              # only necessary if using tight_layout()

fig.add_subplot(gs[2])

fig.tight_layout()                       # not strictly part of the question

plt.show()

Ответ 2

Вы можете создать фигуру с одним подзадом, который охватывает две строки и один подзаговор, который охватывает одну строку, используя аргумент rowspan для subplot2grid:

import matplotlib.pyplot as plt

fig = plt.figure()
ax1 = plt.subplot2grid((3,1), (0,0), rowspan=2)
ax2 = plt.subplot2grid((3,1), (2,0))
plt.show()

enter image description here

Если вы хотите изменить размер и позицию подзадачи после ее создания, вы можете использовать метод set_position.

ax1.set_position([0.1,0.1, 0.5, 0.5])

Бу вам это не понадобится, чтобы создать описанную вами цифру.

Ответ 3

Вы можете избежать ax.set_position(), используя вместо этого fig.tight_layout(), который пересчитывает новый gridspec:

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

# create the first axes without knowing of further subplot creation
fig, ax = plt.subplots()
ax.plot(range(5), 'o-')

# now update the existing gridspec ...
gs = gridspec.GridSpec(3, 1)
ax.set_subplotspec(gs[0:2])
# ... and recalculate the positions
fig.tight_layout()

# add a new subplot
fig.add_subplot(gs[2])
fig.tight_layout()
plt.show()