2016-01-21 32 views
12

Sto provando a creare una figura che consiste in una griglia 2x2, dove in ogni quadrante ci sono 2 sottotrammi sovrapposti verticalmente (cioè una griglia 2x1). Non riesco a capire come ottenere questo, però.Matplotlib - aggiunta di sottotrame a una sottotrama?

Il più vicino che ho ottenuto è l'utilizzo di gridspec e un po 'di codice brutto (vedi sotto), ma poiché gridspec.update(hspace=X) cambia la spaziatura per tutte le sottotrame non sono ancora dove mi piacerebbe essere.

Idealmente quello che voglio è, usando l'immagine qui sotto come un esempio, diminuire la spaziatura tra le sottotrame all'interno di ogni quadrante, aumentando al contempo la spaziatura verticale tra i quadranti superiore e inferiore (cioè tra 1-3 e 2-4).

C'è un modo per farlo (con o senza usare gridspec)? Quello che avevo inizialmente immaginato è generare ciascuna delle griglie sub-subplot (cioè ogni griglia 2x1) e inserirle nella griglia 2x2 di sottotrame più grande, ma non ho capito come aggiungere una sottotrama a una sottotrama, se c'è persino lontano.

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

risposta

18

È possibile nest your GridSpec using SubplotSpec. La griglia esterna sarà 2 x 2 e le griglie interne saranno 2 x 1. Il seguente codice dovrebbe darti l'idea di 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

+0

perfetto, grazie :) – user3014097