Mejorar el tamaño/espaciado de las subtramas con muchas subtramas
Necesito generar un montón de gráficos apilados verticalmente en matplotlib. El resultado se guardará savefig
y 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)
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
Con diseño ajustado
Puede utilizar plt.subplots_adjust
para 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.
Similar a tight_layout
matplotlib 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_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 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()
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
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=None
no 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()