Отрегулируйте высоту подзаговора с 1 строкой и 2 столбцами

Я хочу создать два сюжета, причем второй сюжет обычно составляет около 1/2 или меньше размера основного сюжета. Однако при попытке сделать это с одной строкой и двумя столбцами я получаю сообщение об ошибке

fig, axs=plt.subplots(1,2, figsize=(12,10), gridspec_kw = {'height_ratios': [2,1],
                                                        'width_ratios':[3,1]})

(ValueError: Expected the given number of height ratios to match the number of rows of the grid).

Если я добавлю только один аргумент в список для height ratios, то я получу два графика одинакового размера.

fig, axs=plt.subplots(1,2, figsize=(12,10), gridspec_kw = {'height_ratios': [3],
                                                        'width_ratios':[3,1]})

Этот график показан ниже. Как я могу сделать график справа вдвое меньше, чем слева, поместив его в правом нижнем углу (а не в правом верхнем)?


1
204
1

Ответ:

Решено

Хитрость здесь в том, что height_ratios зависит от количества строк. Соотношение - это отношение между двумя вещами, поэтому вы не можете ввести соотношение между подграфиками высоты, если есть только одна строка (также известная как «высота» для подграфиков) - независимо от того, сколько столбцов есть. Однако вы можете обмануть plt.subplots, используя fig.add_gridspec, чтобы ввести больше строк и столбцов, но никогда не вызывать их. Вот как вы можете это сделать:

import matplotlib.pyplot as plt

if __name__ == "__main__":

    fig = plt.figure(figsize=(12, 10))
    gs = fig.add_gridspec(nrows=2, ncols=2, width_ratios=[3, 1])

    fig.suptitle('An overall title')

    # Add left subplot
    # gs[top and bottom rows, first column (the 'left' subplot))]
    ax_left = fig.add_subplot(gs[:, 0])
    ax_left.set_xlabel("Left X label")
    ax_left.set_ylabel("Left Y label")

    # Add bottom right subplot - gs[bottom row, last column (the 'left' subplot)]
    # We do not add the upper right subplot
    ax_right_bottom = fig.add_subplot(gs[-1, -1])
    ax_right_bottom.set_xlabel("Right Bottom X label")
    ax_right_bottom.set_ylabel("Right Bottom Y label")

    plt.tight_layout()
    plt.show()

Если вы хотите сделать нижний правый подграфик меньше или больше по отношению к левому подграфику, теперь вы можете использовать height_ratios, потому что теперь есть две строки, и вы можете реализовать соотношение.

Вы можете прочитать больше об этом в Расположение нескольких осей на рисунке — там полно полезных советов по работе с осями и сюжетными линиями. Ваше здоровье!