Matplotlib - добавление подзаголовков в подзаголовок?

Я пытаюсь создать фигуру, состоящую из сетки 2x2, где в каждом квадранте есть 2 вертикально уложенных подзаголовка (т.е. сетка 2x1). Однако я не могу понять, как этого добиться.

Самое близкое, что я получил, это использование gridspec и некоторого уродливого кода (см. Ниже), но поскольку gridspec.update(hspace=X) изменяет интервал для всех подзаговоров, я все еще не там, где хотел бы быть.

В идеале, я хочу, используя приведенное ниже изображение в качестве примера, уменьшить расстояние между подзаголовками в каждом квадранте, увеличивая вертикальное расстояние между верхним и нижним квадрантами (т.е. между 1-3 и 2-4).

Есть ли способ сделать это (с использованием или без использования gridspec)? Первоначально я представлял собой создание каждой из подсетей-сеток (т.е. Каждую сетку 2x1) и вставляя их в большую сетку 2x2 подзаголовков, но я не понял, как добавить подзаговор в подзаголовок, если есть даже далеко.

enter image description here

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(4,2)
gs.update(hspace=0.4)
for i in range(2):
    for j in range(4):
        ax = plt.subplot(gs[j,i])
        ax.spines['top'].set_visible(False)
        ax.spines['right'].set_visible(False)
        plt.tick_params(which='both', top='off', right='off')
        if j % 2 == 0:
            ax.set_title(str(i+j+1))
            ax.plot([1,2,3], [1,2,3])
            ax.spines['bottom'].set_visible(False)
            ax.get_xaxis().set_visible(False)   
        else:
            ax.plot([1,2,3], [3,2,1])

Ответы

Ответ 1

Вы можете вложить свой GridSpec с помощью SubplotSpec. Внешняя сетка будет 2 x 2, а внутренние сетки будут 2 x 1. Следующий код должен дать вам основную идею.

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

fig = plt.figure(figsize=(10, 8))
outer = gridspec.GridSpec(2, 2, wspace=0.2, hspace=0.2)

for i in range(4):
    inner = gridspec.GridSpecFromSubplotSpec(2, 1,
                    subplot_spec=outer[i], wspace=0.1, hspace=0.1)

    for j in range(2):
        ax = plt.Subplot(fig, inner[j])
        t = ax.text(0.5,0.5, 'outer=%d, inner=%d' % (i,j))
        t.set_ha('center')
        ax.set_xticks([])
        ax.set_yticks([])
        fig.add_subplot(ax)

fig.show()

enter image description here