2016-01-21 15 views
12

Próbuję utworzyć figurę, która składa się z siatki 2x2, gdzie w każdym kwadrancie znajdują się 2 pionowo ułożone partycje (to jest siatka 2x1). Nie potrafię jednak wymyślić, jak to osiągnąć.Matplotlib - dodawanie subplots do subplot?

Najbliższe, jakie dostałem, to używanie gridspec i trochę brzydkiego kodu (patrz poniżej), ale ponieważ gridspec.update(hspace=X) zmienia odstępy dla wszystkich wątków, nadal nie jestem tam, gdzie chciałbym być.

Idealnie, czego chcę, to użycie poniższego rysunku jako przykładu, zmniejszenie odstępu między partiami w każdym kwadrancie, przy jednoczesnym zwiększeniu pionowego odstępu między górnymi i dolnymi kwadrantami (tj. Między 1-3 a 2-4).

Czy istnieje sposób na to (z użyciem lub bez użycia siatki)? To, co początkowo planowałem, to generowanie każdej z siatek pod-wątków (tj. Każdej siatki 2x1) i wstawianie ich do większej siatki 2x2 subplotów, ale nie wymyśliłem, jak dodać subplot do subplota, jeśli jest nawet sposób.

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

Odpowiedz

18

Można nest your GridSpec using SubplotSpec. Zewnętrzna siatka będzie 2 x 2, a wewnętrzne siatki będą 2 x 1. Poniższy kod powinien dać ci podstawowy pomysł.

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

doskonałe, dziękuję :) – user3014097

Powiązane problemy