/ / Organizar subplots matplotlib en cuadrícula sesgada - python, matplotlib, subplot

Organice las subparcelas de matplotlib en cuadrícula sesgada - python, matplotlib, subparcela

Usando matplotlib, me gustaría mostrar múltipleslas subparcelas en una cuadrícula que tiene un número diferente de columnas por fila, donde cada subparcela tiene aproximadamente el mismo tamaño, y las subparcelas se organizan de manera que estén más o menos centradas, de esta manera:

Cuadrícula de ejes en patrón (2, 3, 2)

Es bastante sencillo crear una cuadrícula que tenga el patrón 2, 3, 2 con gridspec, pero el problema es que gridspecComo era de esperar, los alinea con una cuadrícula, por lo que las parcelas en las filas con 2 parcelas en ellas son más amplias:

Rejilla alineada con rejilla.

Aquí está el código para generar eso:

from matplotlib import gridspec
from matplotlib import pyplot as plt

fig = plt.figure()

arrangement = (2, 3, 2)
nrows = len(arrangement)

gs = gridspec.GridSpec(nrows, 1)
ax_specs = []
for r, ncols in enumerate(arrangement):
gs_row = gridspec.GridSpecFromSubplotSpec(1, ncols, subplot_spec=gs[r])
for col in range(ncols):
ax = plt.Subplot(fig, gs_row[col])
fig.add_subplot(ax)

for i, ax in enumerate(fig.axes):
ax.text(0.5, 0.5, "Axis: {}".format(i), fontweight="bold",
va="center", ha="center")
ax.tick_params(axis="both", bottom="off", top="off", left="off",
right="off", labelbottom="off", labelleft="off")

plt.tight_layout()

Sé que puedo configurar un montón de subplots ymodifique su disposición resolviendo la geometría de la misma, pero creo que podría complicarse un poco, así que esperaba que hubiera un método más simple disponible.

Debo tener en cuenta que aunque estoy usando un arreglo (2, 3, 2) como mi ejemplo, me gustaría hacer esto para colecciones arbitrarias, no solo esta.

Respuestas

3 para la respuesta № 1

La idea suele ser encontrar lo común.denominador entre las subparcelas, es decir, la subparcela más grande de la que se puede componer la cuadrícula deseada, y abarcar todas las subparcelas en varias de ellas de manera que se logre el diseño deseado.

enter image description here

Aquí tienes 3 filas y 6 columnas y cada una.la subparcela abarca 1 fila y dos columnas, solo que las subparcelas en la primera fila abarcan las posiciones 1/2 y 3/4, mientras que en la segunda fila abarcan las posiciones 0/1, 2/3, 4/5.

import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

gs = gridspec.GridSpec(3, 6)
ax1a = plt.subplot(gs[0, 1:3])
ax1b = plt.subplot(gs[0, 3:5])
ax2a = plt.subplot(gs[1, :2])
ax2b = plt.subplot(gs[1, 2:4])
ax2c = plt.subplot(gs[1, 4:])
ax3a = plt.subplot(gs[2, 1:3])
ax3b = plt.subplot(gs[2, 3:5])


for i, ax in enumerate(plt.gcf().axes):
ax.text(0.5, 0.5, "Axis: {}".format(i), fontweight="bold",
va="center", ha="center")
ax.tick_params(axis="both", bottom="off", top="off", left="off",
right="off", labelbottom="off", labelleft="off")

plt.tight_layout()

plt.show()

enter image description here