Reputation: 27
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
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