2017-03-31 48 views
1

我正在尝试创建一个类似于 this question的图。使用gridspec添加数字

为什么我只获得两个pannels,即只是GS2:

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 

def main(): 
    fig = plt.figure() 
    gs1 = gridspec.GridSpec(1,4) 
    gs2 = gridspec.GridSpec(2,4) 

    for n in range(4): 
     ax00 = plt.subplot(gs1[0,n]) 
     ax10 = plt.subplot(gs2[0,n]) 
     ax11 = plt.subplot(gs2[1,n]) 

     ax00.plot([0,0],[0,1*n],color='r') 
     ax10.plot([0,1],[0,2*n],color='b') 
     ax11.plot([0,1],[0,3*n],color='g') 
    plt.show() 

main() 

,给了我这样的:

enter image description here

最后,我想有一个像图:

enter image description here

其中I使用问题末尾的代码获得。然而,我想要有可动性的地块,其中gs2.update(hspace=0)给出(之所以我尝试使用gridspec)。即我想删除最后一行和第二行之间的空格。

def whatIwant(): 
    f, axarr = plt.subplots(3,4) 

    for i in range(4): 
     axarr[0][i].plot([0,0],[0,1*i],color='r') 
     axarr[1][i].plot([0,1],[0,2*i],color='b') #remove the space between those and be able to move the plots where I want 
     axarr[2][i].plot([0,1],[0,3*i],color='g') 
    plt.show() 
+0

Hello ImportanceOfBeingErnest,我更新了问题。对不起,我一如既往地有点简约。现在更清楚了吗? – Sebastiano1991

回答

1

这确实是其中一种情况,它使用GridSpecFromSubplotSpec是有意义的。也就是说,您可以创建一个总计为GridSpec的列和2行(以及1到2的高度比)。在第一行中,您将GridSpecFromSubplotSpec设置为一行四列。在第二行中,您将放置一行两列和四列,另外指定一个hspace=0.0,这样两个底行之间没有任何间距。

import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 


fig = plt.figure() 

gs = gridspec.GridSpec(2, 1, height_ratios=[1,2]) 
gs0 = gridspec.GridSpecFromSubplotSpec(1, 4, subplot_spec=gs[0], wspace=0.4) 
gs1 = gridspec.GridSpecFromSubplotSpec(2, 4, subplot_spec=gs[1], hspace=0.0, wspace=0.4) 

for n in range(4): 
    ax00 = plt.subplot(gs0[0,n]) 
    ax10 = plt.subplot(gs1[0,n]) 
    ax11 = plt.subplot(gs1[1,n], sharex=ax10) 
    plt.setp(ax10.get_xticklabels(), visible=False) 
    ax00.plot([0,0],[0,1*n],color='r') 
    ax10.plot([0,1],[0,2*n],color='b') 
    ax11.plot([0,1],[0,3*n],color='g') 
plt.show() 

enter image description here

,而不是一个在链接的问题的回答这个方案的好处是,你不重叠GridSpecs,因此不需要考虑他们如何相互关联的。


如果你在为什么从问题的代码没有工作仍然有兴趣:
您需要使用两个不同的GridSpecs的每一个具有(在这种情况下3)行的总金额;但只填充第一个GridSpec的第一行和第二个GridSpec的第二行:

import matplotlib.pyplot as plt 
import matplotlib.gridspec as gridspec 

def main(): 
    fig = plt.figure() 
    gs1 = gridspec.GridSpec(3,4) 
    gs2 = gridspec.GridSpec(3,4, hspace=0.0) 

    for n in range(4): 
     ax00 = plt.subplot(gs1[0,n]) 
     ax10 = plt.subplot(gs2[1,n]) 
     ax11 = plt.subplot(gs2[2,n]) 

     ax00.plot([0,0],[0,1*n],color='r') 
     ax10.plot([0,1],[0,2*n],color='b') 
     ax11.plot([0,1],[0,3*n],color='g') 
    plt.show() 

main()