web-dev-qa-db-fra.com

Matplotlib - ajouter des sous-parcelles à une sous-parcelle?

J'essaie de créer une figure qui se compose d'une grille 2x2, où dans chaque quadrant il y a 2 sous-parcelles empilées verticalement (c'est-à-dire une grille 2x1). Je n'arrive pas à comprendre comment y parvenir, cependant.

Le plus proche que j'ai obtenu utilise gridspec et du code laid (voir ci-dessous), mais parce que gridspec.update(hspace=X) modifie l'espacement pour toutes les sous-parcelles, je ne suis toujours pas là où j'aimerais être.

Idéalement, ce que je veux, c'est, en utilisant l'image ci-dessous à titre d'exemple, réduire l'espacement entre les sous-parcelles dans chaque quadrant, tout en augmentant l'espacement vertical entre les quadrants supérieur et inférieur (c'est-à-dire entre 1-3 et 2-4).

Existe-t-il un moyen de le faire (avec ou sans utiliser gridspec)? Ce que j'avais envisagé à l'origine était de générer chacune des grilles de sous-sous-parcelles (c'est-à-dire chaque grille 2x1) et de les insérer dans la plus grande grille 2x2 de sous-parcelles, mais je n'ai pas compris comment ajouter une sous-parcelle à une sous-parcelle, s'il y a même une façon.

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])
22
dan_g

Vous pouvez imbriquer votre GridSpec en utilisant SubplotSpec . La grille extérieure sera 2 x 2 et les grilles intérieures seront 2 x 1. Le code suivant devrait vous donner l'idée de base.

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

38
Suever