too subplots sub small separation separate pyplot plots how examples example espacio entre 4x4 python matplotlib

python - small - Subplots Matplotlib_adjust hspace para títulos y xlabels no se superponen?



subplot size matplotlib (3)

El enlace publicado por Jose se ha actualizado y pylab ahora tiene una función tight_layout() que lo hace automáticamente (en matplotlib versión 1.1.0).

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.tight_layout

http://matplotlib.org/users/tight_layout_guide.html#plotting-guide-tight-layout

Con, digamos, 3 filas de subparcelas en matplotlib, xlabels de una fila puede superponerse con el título de la siguiente. Uno tiene que pl.subplots_adjust(hspace) con pl.subplots_adjust(hspace) , que es molesto.

¿Hay una receta para hspace que evite superposiciones y funcione para cualquier nrow?

""" matplotlib xlabels overlap titles ? """ import sys import numpy as np import pylab as pl nrow = 3 hspace = .4 # of plot height, titles and xlabels both fall within this ?? exec "/n".join( sys.argv[1:] ) # nrow= ... y = np.arange(10) pl.subplots_adjust( hspace=hspace ) for jrow in range( 1, nrow+1 ): pl.subplot( nrow, 1, jrow ) pl.plot( y**jrow ) pl.title( 5 * ("title %d " % jrow) ) pl.xlabel( 5 * ("xlabel %d " % jrow) ) pl.show()

Mis versiones:

  • matplotlib 0.99.1.1,
  • Python 2.6.4,
  • Mac OSX 10.4.11,
  • backend: Qt4Agg ( TkAgg => Excepción en la devolución de llamada Tkinter)

(Para muchos puntos adicionales, ¿alguien puede delinear cómo funciona el empacador / espaciador de matplotlib, siguiendo las líneas del capítulo 17 "el empacador" en el libro Tcl / Tk?)


Encuentro esto bastante complicado, pero hay algo de información aquí en las preguntas frecuentes de MatPlotLib . Es bastante engorroso, y requiere saber qué espacio ocupan los elementos individuales (etiquetas tic) ...

Actualización: la página indica que la función tight_layout() es la manera más fácil de hacerlo, que intenta corregir automáticamente el espaciado.

De lo contrario, muestra formas de adquirir los tamaños de varios elementos (por ejemplo, etiquetas) para que luego pueda corregir los espaciamientos / posiciones de los elementos de sus ejes. Aquí hay un ejemplo de la página de preguntas frecuentes anterior, que determina el ancho de una etiqueta de eje y muy amplia, y ajusta el ancho del eje en consecuencia:

import matplotlib.pyplot as plt import matplotlib.transforms as mtransforms fig = plt.figure() ax = fig.add_subplot(111) ax.plot(range(10)) ax.set_yticks((2,5,7)) labels = ax.set_yticklabels((''really, really, really'', ''long'', ''labels'')) def on_draw(event): bboxes = [] for label in labels: bbox = label.get_window_extent() # the figure transform goes from relative coords->pixels and we # want the inverse of that bboxi = bbox.inverse_transformed(fig.transFigure) bboxes.append(bboxi) # this is the bbox that bounds all the bboxes, again in relative # figure coords bbox = mtransforms.Bbox.union(bboxes) if fig.subplotpars.left < bbox.width: # we need to move it over fig.subplots_adjust(left=1.1*bbox.width) # pad a little fig.canvas.draw() return False fig.canvas.mpl_connect(''draw_event'', on_draw) plt.show()


Puede usar plt.subplots_adjust para cambiar el espaciado entre las subtramas Enlace

subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None) left = 0.125 # the left side of the subplots of the figure right = 0.9 # the right side of the subplots of the figure bottom = 0.1 # the bottom of the subplots of the figure top = 0.9 # the top of the subplots of the figure wspace = 0.2 # the amount of width reserved for blank space between subplots hspace = 0.2 # the amount of height reserved for white space between subplots