python - how to change font size matplotlib
Cómo eliminar las brechas entre las subtramas en matplotlib? (4)
¿Has probado plt.tight_layout()
?
con plt.tight_layout()
sin ello:
O bien: algo como esto (use add_axes
)
left=[0.1,0.3,0.5,0.7]
width=[0.2,0.2, 0.2, 0.2]
rectLS=[]
for x in left:
for y in left:
rectLS.append([x, y, 0.2, 0.2])
axLS=[]
fig=plt.figure()
axLS.append(fig.add_axes(rectLS[0]))
for i in [1,2,3]:
axLS.append(fig.add_axes(rectLS[i],sharey=axLS[-1]))
axLS.append(fig.add_axes(rectLS[4]))
for i in [1,2,3]:
axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))
axLS.append(fig.add_axes(rectLS[8]))
for i in [5,6,7]:
axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))
axLS.append(fig.add_axes(rectLS[12]))
for i in [9,10,11]:
axLS.append(fig.add_axes(rectLS[i+4],sharex=axLS[i],sharey=axLS[-1]))
Si no necesita compartir ejes, simplemente axLS=map(fig.add_axes, rectLS)
El siguiente código produce brechas entre las subtramas. ¿Cómo elimino las brechas entre las subtramas y hago que la imagen sea una cuadrícula ajustada?
import matplotlib.pyplot as plt
for i in range(16):
i = i + 1
ax1 = plt.subplot(4, 4, i)
plt.axis(''on'')
ax1.set_xticklabels([])
ax1.set_yticklabels([])
ax1.set_aspect(''equal'')
plt.subplots_adjust(wspace=None, hspace=None)
plt.show()
El problema es el uso de aspect=''equal''
, que impide que las subtramas se extiendan a una relación de aspecto arbitraria y llenen todo el espacio vacío.
Normalmente, esto funcionaría:
import matplotlib.pyplot as plt
ax = [plt.subplot(2,2,i+1) for i in range(4)]
for a in ax:
a.set_xticklabels([])
a.set_yticklabels([])
plt.subplots_adjust(wspace=0, hspace=0)
El resultado es esto:
Sin embargo, con aspect=''equal''
, como en el siguiente código:
import matplotlib.pyplot as plt
ax = [plt.subplot(2,2,i+1) for i in range(4)]
for a in ax:
a.set_xticklabels([])
a.set_yticklabels([])
a.set_aspect(''equal'')
plt.subplots_adjust(wspace=0, hspace=0)
Esto es lo que obtenemos:
La diferencia en este segundo caso es que ha obligado a los ejes x e y a tener el mismo número de unidades / píxel. Dado que los ejes van de 0 a 1 por defecto (es decir, antes de trazar cualquier cosa), el uso de aspect=''equal''
obliga a cada eje a ser un cuadrado. Como la figura no es un cuadrado, pyplot agrega espacio adicional entre los ejes horizontalmente.
Para evitar este problema, puede establecer que su figura tenga la relación de aspecto correcta. Vamos a utilizar aquí la interfaz pyplot orientada a objetos, que considero superior en general:
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(8,8)) # Notice the equal aspect ratio
ax = [fig.add_subplot(2,2,i+1) for i in range(4)]
for a in ax:
a.set_xticklabels([])
a.set_yticklabels([])
a.set_aspect(''equal'')
fig.subplots_adjust(wspace=0, hspace=0)
Este es el resultado:
Puede usar gridspec para controlar el espaciado entre ejes. Hay más information aquí.
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
plt.figure(figsize = (4,4))
gs1 = gridspec.GridSpec(4, 4)
gs1.update(wspace=0.025, hspace=0.05) # set the spacing between axes.
for i in range(16):
# i = i + 1 # grid spec indexes from 0
ax1 = plt.subplot(gs1[i])
plt.axis(''on'')
ax1.set_xticklabels([])
ax1.set_yticklabels([])
ax1.set_aspect(''equal'')
plt.subp
plt.show()
Sin recurrir a gridspec completo, también se puede utilizar lo siguiente para eliminar las lagunas al establecer wspace y hspace en cero:
import matplotlib.pyplot as plt
plt.clf()
f, axarr = plt.subplots(4, 4, gridspec_kw = {''wspace'':0, ''hspace'':0})
for i, ax in enumerate(f.axes):
ax.grid(''on'', linestyle=''--'')
ax.set_xticklabels([])
ax.set_yticklabels([])
plt.show()
plt.close()
Resultando en: