¿Cómo eliminar los espacios entre las subparcelas en matplotlib?

116

El siguiente código produce espacios entre las subtramas. ¿Cómo elimino los espacios entre las subtramas y hago que la imagen sea una cuadrícula ajustada?

ingrese la descripción de la imagen aquí

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()
usuario3006135
fuente
2
publicar un enlace y se puede editar en. Noneno está haciendo lo que piensa, significa 'usar el predeterminado'.
Tacaswell
Intenté agregar números en lugar de 'Ninguno' pero esto no resolvió el problema.
user3006135
4
plt.subplots_adjust(wspace=0, hspace=0)resolvería su problema, si no fuera por el hecho de que utiliza el 'equal'aspecto. Vea mi respuesta para más detalles.
apdnu

Respuestas:

100

Puede usar gridspec para controlar el espaciado entre ejes. Hay más información 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.show()

ejes muy juntos

muchacha
fuente
35
No se limita a GridSpec, si agarra la figura en la creación, también puede establecer las distancias con:fig.subplots_adjust(hspace=, wspace=)
Rutger Kassies
3
¿Qué significa la última línea del forciclo?
Ciprian Tomoiagă
Este es un consejo muy bueno, pero no se usa subplots. Esta respuesta hace el trabajo sin sacrificarse subplots.
wizclown
¿Hay alguna forma de eliminar el espacio horizontal solo entre la primera y la segunda fila de ejes?
Stefano
136

El problema es el uso de aspect='equal' , que evita 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 este:

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 forzado a los ejes xey 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 graficar nada), el uso aspect='equal'obliga a que cada eje sea un cuadrado. Dado que la figura no es un cuadrado, pyplot agrega un espacio adicional entre los ejes horizontalmente.

Para solucionar este problema, puede configurar su figura para que tenga la relación de aspecto correcta. Vamos a utilizar la interfaz pyplot orientada a objetos aquí, 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)

Aquí está el resultado:

apdnu
fuente
3
¡Gracias! tu respuesta es simple y funciona perfectamente. plt.subplots_adjust(wspace=0, hspace=0)
MohamedEzz
35

Sin recurrir a gridspec por completo, lo siguiente también podría usarse para eliminar los espacios 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:

.

Ingeniero libre de herpes
fuente
4

¿Usted ha intentado plt.tight_layout()?

con plt.tight_layout() ingrese la descripción de la imagen aquí sin él: ingrese la descripción de la imagen aquí

O: algo como esto (usar 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) ingrese la descripción de la imagen aquí

CT Zhu
fuente
Probé un diseño ajustado, pero no eliminó los huecos, que es lo que quiero. La solución de gridspec funcionó. Gracias por las sugerencias.
user3006135
Esto funcionó muy bien junto con las otras sugerencias. tight_layout () ayudó a eliminar el espacio en blanco arriba y a los lados de la trama que no tenía ningún propósito.
Quizás
0

Con las versiones recientes de matplotlib, es posible que desee probar el diseño restringido . Sin plt.subplot()embargo, esto no funciona , por lo que debe usar plt.subplots()en su lugar:

fig, axs = plt.subplots(4, 4, constrained_layout=True)
Michel de Ruiter
fuente