Mejore el tamaño / espaciado de las subplots con muchas subplots en matplotlib

Muy similar a esta pregunta, pero con la diferencia de que mi figura puede ser tan grande como debe ser.

Necesito generar un montón de plots astackdas verticalmente en matplotlib. El resultado se guardará utilizando Figsave y se verá en una página web, por lo que no me importa la altura de la imagen final, siempre que las subplots estén espaciadas para que no se superpongan.

No importa qué tan grande permita que sea la figura, las subplots siempre parecen superponerse.

Mi código actualmente parece

import matplotlib.pyplot as plt import my_other_module titles, x_lists, y_lists = my_other_module.get_data() fig = plt.figure(figsize=(10,60)) for i, y_list in enumerate(y_lists): plt.subplot(len(titles), 1, i) plt.xlabel("Some X label") plt.ylabel("Some Y label") plt.title(titles[i]) plt.plot(x_lists[i],y_list) fig.savefig('out.png', dpi=100) 

Trate de usar plt.tight_layout

Como un ejemplo rápido:

 import matplotlib.pyplot as plt fig, axes = plt.subplots(nrows=4, ncols=4) fig.tight_layout() # Or equivalently, "plt.tight_layout()" plt.show() 

Sin diseño apretado

introduzca la descripción de la imagen aquí


Con diseño apretado introduzca la descripción de la imagen aquí

Puede usar plt.subplots_adjust para cambiar el espaciado entre las subplots (fuente)

firma de llamada:

 subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None) 

Los significados de los parámetros (y los valores predeterminados sugeridos) son:

 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 

Los valores predeterminados reales son controlados por el archivo rc

Descubrí que subplots_adjust (hspace = 0.001) es lo que terminó funcionando para mí. Cuando uso el espacio = Ninguno, todavía hay espacio en blanco entre cada gráfico. Ponerlo en algo muy cercano a cero, sin embargo, parece obligarlos a alinearse. Lo que he cargado aquí no es el código más elegante, pero puedes ver cómo funciona el hspace.

 import numpy as np import matplotlib.pyplot as plt import matplotlib.ticker as tic fig = plt.figure() x = np.arange(100) y = 3.*np.sin(x*2.*np.pi/100.) for i in range(5): temp = 510 + i ax = plt.subplot(temp) plt.plot(x,y) plt.subplots_adjust(hspace = .001) temp = tic.MaxNLocator(3) ax.yaxis.set_major_locator(temp) ax.set_xticklabels(()) ax.title.set_visible(False) plt.show() 

introduzca la descripción de la imagen aquí

 import matplotlib.pyplot as plt fig = plt.figure(figsize=(10,60)) plt.subplots_adjust( ... ) 

El método plt.subplots_adjust :

 def subplots_adjust(*args, **kwargs): """ call signature:: subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None) Tune the subplot layout via the :class:`matplotlib.figure.SubplotParams` mechanism. The parameter meanings (and suggested defaults) are:: 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 The actual defaults are controlled by the rc file """ fig = gcf() fig.subplots_adjust(*args, **kwargs) draw_if_interactive() 

o

 fig = plt.figure(figsize=(10,60)) fig.subplots_adjust( ... ) 

El tamaño de la imagen importa.

“He intentado desordenar con hspace, pero boostlo solo parece hacer que todos los gráficos sean más pequeños sin resolver el problema de superposición”.

Por lo tanto, para hacer más espacio en blanco y mantener el tamaño de la ttwig secundaria, la imagen total debe ser más grande.

Podrías probar el subplot_tool ()

 plt.subplot_tool() 

Al igual que en tight_layout matplotlib ahora (a partir de la versión 2.2) proporciona constrained_layout . A diferencia de tight_layout , que puede llamarse en cualquier momento en el código para un solo diseño optimizado, constrained_layout es una propiedad, que puede estar activa y optimizará el diseño antes de cada paso del dibujo.

Por lo tanto, debe activarse antes o durante la creación de la subplot, como la figure(constrained_layout=True) o las subplots(constrained_layout=True) .

Ejemplo:

 import matplotlib.pyplot as plt fig, axes = plt.subplots(4,4, constrained_layout=True) plt.show() 

introduzca la descripción de la imagen aquí

rcParams también se puede establecer a través de rcParams

 plt.rcParams['figure.constrained_layout.use'] = True 

Consulte la entrada de novedades y la Guía de diseño restringido.