Control programático de ajuste de subtrama #

Nota

Este ejemplo está destinado principalmente a mostrar algunos conceptos avanzados en Matplotlib.

Si solo busca tener suficiente espacio para sus etiquetas, casi siempre es más simple y lo suficientemente bueno como establecer los parámetros de la subparcela manualmente usando Figure.subplots_adjusto usar uno de los mecanismos de diseño automático ( Guía de diseño restringido o Guía de diseño ajustado ).

Este ejemplo describe una forma definida por el usuario de leer los tamaños de los artistas y establecer los parámetros de la trama secundaria en consecuencia. Su objetivo principal es ilustrar algunos conceptos avanzados como leer posiciones de texto, trabajar con cuadros delimitadores y transformaciones y usar eventos . Pero también puede servir como punto de partida si desea automatizar el diseño y necesita más flexibilidad que un diseño ajustado y un diseño restringido.

A continuación, recopilamos los cuadros delimitadores de todas las etiquetas y y movemos el borde izquierdo de la subparcela hacia la derecha para que quede suficiente espacio para la unión de todos los cuadros delimitadores.

Hay un problema con el cálculo de los cuadros delimitadores de texto: consultar los cuadros delimitadores de texto ( Text.get_window_extent) necesita un renderizador ( RendererBaseinstancia) para calcular el tamaño del texto. Este renderizador solo está disponible después de dibujar la figura ( Figure.draw).

Una solución a esto es poner la lógica de ajuste en una devolución de llamada de sorteo. Esta función se ejecuta después de dibujar la figura. Ahora puede verificar si la trama secundaria deja suficiente espacio para el texto. De lo contrario, los parámetros de la subparcela se actualizan y se activa el segundo sorteo.

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()
ajuste automático de subparcelas

Galería generada por Sphinx-Gallery