Fox
Fox

Reputation: 27

Gridspec inside Gridspec

I want to creat a GridSpec inside a Gridpec. I can already create some GridSpecs like my Code here:

import matplotlib.pyplot as plt

for i in range(40):
    i = i + 1
    ax1 = plt.subplot(10, 4, i)
    plt.axis('on')
    ax1.set_xticklabels([])
    ax1.set_yticklabels([])
    ax1.set_aspect('equal')
    plt.subplots_adjust(wspace=None, hspace=None)
plt.show()

But I want 40 gridspecs. In Every Gridspec should be another 21 Grids (inner_grid) and in every inner_grid should be one grid on the top and 6 grids in a row should fill the rest. Nearly like the picture in the end of this link: https://matplotlib.org/tutorials/intermediate/gridspec.html But I don't really understand it.

I have tried this:

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

    fig = plt.figure(figsize=(5,10), dpi=300)
    ax = plt.subplot(gs[i])
    #trying to make multiple gridspec
    # gridspec inside gridspec
        outer_grid = gridspec.GridSpec(48, 1, wspace=0.0, hspace=0.0)

        for i in range(21):
            #ax = plt.subplot(5, 5, i)
            inner_grid = gridspec.GridSpecFromSubplotSpec(5, 5, subplot_spec=outer_grid[i], wspace=0.0, hspace=0.0)
            a, b = int(i/4)+1, i % 4+1
            for j in enumerate(product(range(1, 4), repeat=2)):
                ax = plt.Subplot(fig, inner_grid[j])
                ax.set_xticks([])
                ax.set_yticks([])
                fig.add_subplot(ax)

    all_axes = fig.get_axes()

Upvotes: 0

Views: 1318

Answers (1)

Diziet Asahi
Diziet Asahi

Reputation: 40697

Are you sure that's what you want to do? That's 40*21*6=5040 axes in one figure... In addition, your description (grid with 40 cells and 21 inner cells in each cells) doesn't match the code provided where you have 48 cells, and 25 cells in each...

In any case, this is how I would go about generating what you are describing. Note that you don't necessarily have to generate intermediate Axes object. Only generate axes where you are going to plot something.

Finally, depending on what you are actually trying to achieve, I'm pretty sure there must be a better way than to create thousands of axes.

import matplotlib.gridspec as gridspec
fig = plt.figure(figsize=(40,100))


outer_grid = gridspec.GridSpec(10,4, wspace=0, hspace=0)

for outer in outer_grid:
    # ax = fig.add_subplot(outer)
    # ax.set_xticklabels([])
    # ax.set_yticklabels([])
    # ax.set_aspect('equal')

    inner_grid_1 = gridspec.GridSpecFromSubplotSpec(5,5, subplot_spec=outer)
    for inner in inner_grid_1:
        # ax1 = fig.add_subplot(inner)
        # ax1.set_xticklabels([])
        # ax1.set_yticklabels([])
        # ax1.set_aspect('equal')

        inner_grid_2 = gridspec.GridSpecFromSubplotSpec(2,6, subplot_spec=inner)
        ax_top = fig.add_subplot(inner_grid_2[0,:]) # top row
        for i in range(6):
            ax2 = fig.add_subplot(inner_grid_2[1,i]) # bottom row
            ax2.set_xticklabels([])
            ax2.set_yticklabels([])

plt.show()

Upvotes: 1

Related Questions