Nota
Haga clic aquí para descargar el código de ejemplo completo
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_adjust
o 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 ( RendererBase
instancia) 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()

Referencias
En este ejemplo se muestra el uso de las siguientes funciones, métodos, clases y módulos: