/ / Organiser des sous-parcelles matplotlib dans une grille asymétrique - python, matplotlib, sous-parcelle

Organiser les sous-parcelles matplotlib dans une grille asymétrique - python, matplotlib, sous-parcelle

En utilisant matplotlib, je souhaite afficher plusieursles sous-parcelles d'une grille comportant un nombre différent de colonnes par ligne, chaque sous-parcelle ayant à peu près la même taille, et les sous-parcelles étant disposées de manière à être plus ou moins centrées, comme suit:

Grille d'axes en motif (2, 3, 2)

C’est assez simple de créer une grille qui a le motif 2, 3, 2 avec gridspec, mais le problème est que gridspec, sans surprise, les aligne sur une grille, de sorte que les parcelles dans les rangées avec 2 parcelles sont plus larges:

Grille alignée avec gridspec

Voici le code pour générer cela:

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()

Je sais que je peux créer un tas de sous-parcelles etmodifiez leur arrangement en travaillant sur la géométrie de celui-ci, mais je pense que cela pourrait devenir un peu compliqué, alors j'espérais qu'une méthode plus simple serait disponible.

Je devrais noter que même si j’utilise un arrangement (2, 3, 2) comme exemple, j’aimerais faire cela pour des collections arbitraires, pas seulement pour celui-ci.

Réponses:

3 pour la réponse № 1

L'idée est généralement de trouver le commundénominateur entre les sous-parcelles, c’est-à-dire la plus grande sous-parcelle avec laquelle la grille souhaitée peut être composée, et s’étendant sur toutes les sous-parcelles sur plusieurs de celles-ci, de manière à obtenir la disposition souhaitée.

entrer la description de l'image ici

Ici vous avez 3 lignes et 6 colonnes et chacunela sous-parcelle s'étend sur 1 ligne et deux colonnes, mais les sous-parcelles de la première ligne couvrent les positions 1/2 et 3/4, tandis que dans la deuxième ligne, elles occupent les positions 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()

entrer la description de l'image ici