2016-01-21 12 views
12

Ich versuche, eine Figur zu erstellen, die aus einem 2x2-Gitter besteht, wobei in jedem Quadranten zwei vertikal gestapelte Unterplots (d. H. Ein 2x1-Gitter) vorhanden sind. Ich kann jedoch nicht herausfinden, wie ich das erreichen kann.Matplotlib - Subplots zu einem Subplot hinzufügen?

Die nächste, die ich bekommen habe, ist mit gridspec und einigen hässlichen Code (siehe unten), aber weil gridspec.update(hspace=X) den Abstand für alle Unterplots ändert, bin ich immer noch nicht wo ich sein möchte.

Idealerweise möchte ich, indem ich das Bild unten als Beispiel benutze, den Abstand zwischen den Subplots innerhalb jedes Quadranten verringern, während der vertikale Abstand zwischen den oberen und unteren Quadranten erhöht wird (dh zwischen 1-3 und 2-4).

Gibt es eine Möglichkeit, dies zu tun (mit oder ohne gridspec)? Was ich ursprünglich vorhatte, ist, jedes Sub-Subplot-Gitter (dh jedes 2x1-Gitter) zu erzeugen und es in das größere 2x2-Raster von Subplots einzufügen, aber ich habe nicht herausgefunden, wie ein Subplot zu einem Subplot hinzugefügt werden kann, wenn es gerade ist Weg.

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

Antwort

18

Sie nest your GridSpec using SubplotSpec können. Das äußere Gitter ist ein 2 x 2 und das innere Gitter wird 2 x 1. Der folgende Code sollte Ihnen die Grundidee geben.

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

perfekt, danke :) – user3014097