pythonmatplotlibmultiple-axesmatplotlib-gridspec

Adjust space between two axes while keeping it constant on other axes


For some reason I couldn't find information on this (I'm pretty sure it exists somewhere), but in the following generic example, I would like to reduce the hspace between ax1 and ax2 while keeping the same hspace between ax2-ax3 and ax3-ax4.

I'd also appreciate any links to an example like that!

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec


def annotate_axes(fig):
    for i, ax in enumerate(fig.axes):
        ax.text(0.5, 0.5, "ax%d" % (i+1), va="center", ha="center")
        ax.tick_params(labelbottom=False, labelleft=False)

fig = plt.figure()

gs1 = GridSpec(6, 1, hspace=0.2)
ax1 = fig.add_subplot(gs1[0])
ax2 = fig.add_subplot(gs1[1])

ax3 = fig.add_subplot(gs1[2:4])
ax4 = fig.add_subplot(gs1[4:6])

annotate_axes(fig)
plt.show()

enter image description here


Solution

  • One way that might suit your need is to create a subgrid (in this example, putting hspace to 0):

    import matplotlib.pyplot as plt
    from matplotlib.gridspec import GridSpec
    
    
    def annotate_axes(fig):
        for i, ax in enumerate(fig.axes):
            ax.text(0.5, 0.5, "ax%d" % (i+1), va="center", ha="center")
            ax.tick_params(labelbottom=False, labelleft=False)
    
    fig = plt.figure()
    
    gs1 = GridSpec(6, 1, hspace=0.2)
    
    # subgrid for the first two slots
    # in this example with no space
    subg = gs1[0:2].subgridspec(2, 1, hspace = 0)
    
    # note the ax1 and ax2 being created from the subgrid
    ax1 = fig.add_subplot(subg[0])
    ax2 = fig.add_subplot(subg[1])
    
    ax3 = fig.add_subplot(gs1[2:4])
    ax4 = fig.add_subplot(gs1[4:6])
    
    annotate_axes(fig)
    plt.show()
    

    enter image description here