Si agrego un subtítulo a mi figura matplotlib, los títulos de la subtrama se superponen. ¿Alguien sabe cómo solucionarlo fácilmente? Probé la tight_layout()
función, pero solo empeora las cosas.
Ejemplo:
import numpy as np
import matplotlib.pyplot as plt
f = np.random.random(100)
g = np.random.random(100)
fig = plt.figure()
fig.suptitle('Long Suptitle', fontsize=24)
plt.subplot(121)
plt.plot(f)
plt.title('Very Long Title 1', fontsize=20)
plt.subplot(122)
plt.plot(g)
plt.title('Very Long Title 2', fontsize=20)
plt.tight_layout()
plt.show()
python
matplotlib
katrasnikj
fuente
fuente
tight_layout
documentos:[left, bottom, right, top] in normalized (0, 1) figure coordinates
tight_layout(rect=[0, 0.03, 1, 0.9])
lugar de0.95
como en la respuesta.Puede ajustar manualmente el espaciado usando
plt.subplots_adjust(top=0.85)
:fuente
subplots_adjust
subplots_adjust
debe llamarse después de cualquier llamada atight_layout
, o no habrá ningún efecto de la llamadasubplots_adjust
.Una cosa que podría cambiar en su código muy fácilmente es la
fontsize
que está utilizando para los títulos. Sin embargo, ¡voy a suponer que no solo quieres hacer eso!Algunas alternativas al uso
fig.subplots_adjust(top=0.85)
:Por
tight_layout()
lo general, hace un trabajo bastante bueno al colocar todo en buenas ubicaciones para que no se superpongan. La razón por latight_layout()
que no ayuda en este caso es porquetight_layout()
no tiene en cuenta fig.suptitle (). Hay un problema abierto sobre esto en GitHub: https://github.com/matplotlib/matplotlib/issues/829 [cerrado en 2014 debido a que requiere un administrador de geometría completo - cambiado a https://github.com/matplotlib/matplotlib / cuestiones / 1109 ].Si lees el hilo, hay una solución a tu problema
GridSpec
. La clave es dejar algo de espacio en la parte superior de la figura al llamartight_layout
, usando elrect
kwarg. Para su problema, el código se convierte en:Usando GridSpec
El resultado:
Tal vez
GridSpec
sea un poco excesivo para usted, o su problema real implicará muchas más subtramas en un lienzo mucho más grande u otras complicaciones. Un truco simple es usarannotate()
y bloquear las coordenadas'figure fraction'
para imitar asuptitle
. Sin embargo, es posible que deba hacer algunos ajustes más finos una vez que eche un vistazo a la salida. Tenga en cuenta que esta segunda solución no utilizatight_layout()
.Solución más simple (aunque es posible que deba ajustarse)
El resultado:
[Utilizando
Python
2.7.3 (64 bits) ymatplotlib
1.2.0]fuente
GridSpec
), ¿cómo puedo crear subtramas que compartan ejes? Usualmente usoplt.subplots(N,1, sharex=<>, sharey=<>)
cuando creo subtramas, pero el código que publicaste usa en suadd_subplot
lugarfig.tight_layout(rect=[0, 0.03, 1, 0.95])
también funciona.Una solución alternativa y fácil de usar es ajustar las coordenadas del texto del título en la figura usando el argumento y en la llamada del título (ver los documentos ):
fuente
El diseño ajustado no funciona con el título, pero
constrained_layout
sí. Ver esta pregunta Mejore el tamaño / espaciado de la subtrama con muchas subtramas en matplotlibEncontré que agregar las subtramas a la vez se veía mejor, es decir
Pero también se puede agregar en el momento en que se crea la figura:
Nota: para acercar mis subtramas, también estaba usando
y restricined_layout no funciona con esto :(
fuente
He luchado con el recorte matplotlib métodos, por lo que he ahora acabo de hacer una función para hacer esto a través de una
bash
llamada aImageMagick
's comando mogrify , que funciona bien y se pone todo el espacio en blanco adicionales fuera del borde de la figura. Esto requiere que esté utilizando UNIX / Linux, esté utilizando elbash
shell y lo hayaImageMagick
instalado.Simplemente envíe una llamada a esto después de su
savefig()
llamada.fuente
Como lo mencionaron otros, por defecto, el diseño ajustado no tiene en cuenta el título. Sin embargo, he descubierto que es posible usar el
bbox_extra_artists
argumento para pasar el supítulo como un cuadro delimitador que debe tenerse en cuenta:Esto obliga al cálculo de diseño ajustado a tener
suptitle
en cuenta, y se ve como es de esperar.fuente
Lo único que funcionó para mí fue modificar la llamada al suptitle:
fuente
Tuve un problema similar que surgió cuando se usaba
tight_layout
para una cuadrícula de tramas muy grande (más de 200 subtramas) y se renderizaba en un cuaderno jupyter. Hice una solución rápida que siempre te colocasuptitle
a cierta distancia por encima de tu subtrama superior:Para las subtramas de tamaño variable, aún puede utilizar este método para obtener la parte superior de la subtrama superior, luego definir manualmente una cantidad adicional para agregar al título.
fuente