Noter
Cliquez ici pour télécharger l'exemple de code complet
Contrôle par programme de l'ajustement des sous-parcelles #
Noter
Cet exemple est principalement destiné à montrer quelques concepts avancés dans Matplotlib.
Si vous cherchez seulement à disposer de suffisamment d'espace pour vos étiquettes, il est presque toujours plus simple et suffisant de définir manuellement les paramètres de la sous-parcelle à l'aide de Figure.subplots_adjust
, ou d'utiliser l'un des mécanismes de mise en page automatique ( Constrained Layout Guide ou
Tight Layout guide ).
Cet exemple décrit une méthode définie par l'utilisateur pour lire les tailles d'artiste et définir les paramètres de sous-parcelle en conséquence. Son objectif principal est d'illustrer certains concepts avancés tels que la lecture de positions de texte, l'utilisation de cadres de délimitation et de transformations et l'utilisation d' événements . Mais cela peut également servir de point de départ si vous souhaitez automatiser la mise en page et avez besoin de plus de flexibilité qu'une mise en page serrée et une mise en page contrainte.
Ci-dessous, nous collectons les boîtes englobantes de toutes les étiquettes y et déplaçons la bordure gauche de la sous-parcelle vers la droite afin qu'elle laisse suffisamment de place pour l'union de toutes les boîtes englobantes.
Il y a un problème avec le calcul des cadres de délimitation de texte : l'interrogation des cadres de délimitation de texte ( Text.get_window_extent
) nécessite un moteur de rendu ( RendererBase
instance) pour calculer la taille du texte. Ce moteur de rendu n'est disponible qu'une fois la figure dessinée ( Figure.draw
).
Une solution à cela consiste à placer la logique d'ajustement dans un rappel de tirage. Cette fonction est exécutée après le dessin de la figure. Il peut maintenant vérifier si l'intrigue secondaire laisse suffisamment de place pour le texte. Si ce n'est pas le cas, les paramètres de la sous-parcelle sont mis à jour et un deuxième tirage est déclenché.
import matplotlib.pyplot as plt
import matplotlib.transforms as mtransforms
fig, ax = plt.subplots()
ax.plot(range(10))
ax.set_yticks([2, 5, 7], labels=['really, really, really', 'long', 'labels'])
def on_draw(event):
bboxes = []
for label in ax.get_yticklabels():
# Bounding box in pixels
bbox_px = label.get_window_extent()
# Transform to relative figure coordinates. This is the inverse of
# transFigure.
bbox_fig = bbox_px.transformed(fig.transFigure.inverted())
bboxes.append(bbox_fig)
# the bbox that bounds all the bboxes, again in relative figure coords
bbox = mtransforms.Bbox.union(bboxes)
if fig.subplotpars.left < bbox.width:
# Move the subplot left edge more to the right
fig.subplots_adjust(left=1.1*bbox.width) # pad a little
fig.canvas.draw()
fig.canvas.mpl_connect('draw_event', on_draw)
plt.show()
Références
L'utilisation des fonctions, méthodes, classes et modules suivants est illustrée dans cet exemple :