Mejorar el tamaño/espaciado de las subtramas con muchas subtramas

Resuelto mcstrother asked hace 13 años • 9 respuestas

Necesito generar un montón de gráficos apilados verticalmente en matplotlib. El resultado se guardará savefigy se verá en una página web, por lo que no me importa qué tan alta sea la imagen final, siempre y cuando las subtramas estén espaciadas para que no se superpongan.

No importa cuán grande permita que sea la figura, las tramas secundarias siempre parecen superponerse.

Mi código actualmente se 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)
mcstrother avatar Jul 01 '11 04:07 mcstrother
Aceptado

Revise matplotlib: guía de diseño ajustado e intente usar matplotlib.pyplot.tight_layout, omatplotlib.figure.Figure.tight_layout

Como ejemplo rápido:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(nrows=4, ncols=4, figsize=(8, 8))
fig.tight_layout() # Or equivalently,  "plt.tight_layout()"

plt.show()

Sin diseño ajustado

ingrese la descripción de la imagen aquí


Con diseño ajustado

ingrese la descripción de la imagen aquí

Joe Kington avatar Mar 22 '2012 17:03 Joe Kington

Puede utilizar plt.subplots_adjustpara cambiar el espacio entre las subtramas.

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 están controlados por el archivo rc.

CyanRook avatar Jun 30 '2011 21:06 CyanRook

Similar a tight_layoutmatplotlib ahora (a partir de la versión 2.2) proporciona constrained_layout. A diferencia de tight_layout, que se puede llamar en cualquier momento en el código para un único diseño optimizado, constrained_layoutes 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 trama secundaria, como por ejemplo figure(constrained_layout=True)o subplots(constrained_layout=True).

Ejemplo:

import matplotlib.pyplot as plt

fig, axes = plt.subplots(4,4, constrained_layout=True)

plt.show()

ingrese la descripción de la imagen aquí

constrained_layout también se puede configurar mediantercParams

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

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

ImportanceOfBeingErnest avatar Aug 02 '2018 15:08 ImportanceOfBeingErnest

El uso subplots_adjust(hspace=0)de o un número muy pequeño ( hspace=0.001) eliminará por completo el espacio en blanco entre las subtramas, mientras que hspace=Noneno lo hace.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as tic

fig = plt.figure(figsize=(8, 8))

x = np.arange(100)
y = 3.*np.sin(x*2.*np.pi/100.)

for i in range(1, 6):
    temp = 510 + i
    ax = plt.subplot(temp)
    plt.plot(x, y)
    plt.subplots_adjust(hspace=0)
    temp = tic.MaxNLocator(3)
    ax.yaxis.set_major_locator(temp)
    ax.set_xticklabels(())
    ax.title.set_visible(False)

plt.show()

hspace=0ohspace=0.001

ingrese la descripción de la imagen aquí

hspace=None

ingrese la descripción de la imagen aquí

Alexa Halford avatar Mar 22 '2012 17:03 Alexa Halford