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