matplotlib 使用gridspec添加地物

xdnvmnnf  于 2023-04-07  发布在  其他
关注(0)|答案(1)|浏览(127)

我试图创建一个类似于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()

这给了我这个:

最后,我希望有一个像这样的数字:

这是我使用问题末尾的代码获得的。然而,我想让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()
chhkpiq4

chhkpiq41#

这确实是使用GridSpecFromSubplotSpec有意义的情况之一。(和1到2的高度比)。在第一行中,您将放置一个具有一行和4列的GridSpecFromSubplotSpec。在第二行中,您将放置一个具有两行和4列的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()

与链接问题的答案中的解决方案相比,此解决方案的优点在于,您不会重叠GridSpecs,因此不需要考虑它们如何相互关联。
如果您仍然对问题中的代码不起作用的原因感兴趣:
您将需要使用两个不同的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()

相关问题