使用gridspec添加数字

时间:2017-03-31 18:59:01

标签: python matplotlib

我正在尝试创建一个类似于来自的情节 this question

为什么我只获得两个面板,即只是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

我使用问题末尾的代码获得的。但是我希望得到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()

1 个答案:

答案 0 :(得分:2)

这确实是其中一种情况,使用GridSpecFromSubplotSpec是有意义的。也就是说,您将创建一个整体GridSpec,其中包含一列和两行(以及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,因此无需考虑它们之间的相互关系。

<小时/> 如果您仍然对问题代码无效的原因感兴趣:
您需要使用两个不同的GridSpec,每个GridSpec具有总行数(在本例中为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()