2016-01-21 102 views
12

我試圖創建一個由2x2網格組成的圖形,其中每個象限中有2個垂直堆疊的子圖(即2x1網格)。不過,我似乎無法弄清楚如何實現這一目標。Matplotlib - 將子圖添加到子圖中?

最近我得到的是使用gridspec和一些醜陋的代碼(見下文),但因爲gridspec.update(hspace=X)更改所有subplots的間距我仍然不是我想要的位置。

理想情況下,我想要的是,使用下面的圖片作爲示例,減少每個象限內的子圖之間的間距,同時增加頂部和底部象限之間的垂直間距(即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]) 

回答

18

你可以nest your GridSpec using 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

+0

完美,謝謝:) – user3014097