Comment supprimer les espaces entre les sous-graphiques dans matplotlib?

116

Le code ci-dessous produit des espaces entre les sous-graphiques. Comment supprimer les espaces entre les sous-graphiques et créer une grille serrée de l'image?

entrez la description de l'image ici

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()
user3006135
la source
2
postez un lien et il peut être édité. Nonene fait pas ce que vous pensez, cela signifie «utiliser la valeur par défaut».
tacaswell
J'ai essayé d'ajouter des nombres au lieu de «Aucun», mais cela n'a pas résolu le problème.
user3006135
4
plt.subplots_adjust(wspace=0, hspace=0)résoudrait votre problème, sans le fait que vous utilisez l' 'equal'aspect. Voir ma réponse pour plus de détails.
apdnu

Réponses:

100

Vous pouvez utiliser gridspec pour contrôler l'espacement entre les axes. Il y a plus d' informations ici.

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()

axes très rapprochés

Molly
la source
35
Ce n'est pas limité à GridSpec, si vous prenez la figurine à la création, vous pouvez également définir les distances avec:fig.subplots_adjust(hspace=, wspace=)
Rutger Kassies
3
que signifie être la dernière ligne de la forboucle?
Ciprian Tomoiagă
C'est une très belle astuce, mais elle ne sert pas subplots. Cette réponse fait le travail sans sacrifier subplots.
wizclown
Existe-t-il un moyen de supprimer l'espacement horizontal uniquement entre les première et deuxième rangées d'axes?
Stefano le
136

Le problème est l'utilisation de aspect='equal', qui empêche les sous-graphiques de s'étirer à un rapport hauteur / largeur arbitraire et de remplir tout l'espace vide.

Normalement, cela fonctionnerait:

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)

Le résultat est le suivant:

Cependant, avec aspect='equal', comme dans le code suivant:

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)

Voici ce que nous obtenons:

La différence dans ce deuxième cas est que vous avez forcé les axes x et y à avoir le même nombre d'unités / pixel. Étant donné que les axes vont de 0 à 1 par défaut (c'est-à-dire avant de tracer quoi que ce soit), l'utilisation aspect='equal'force chaque axe à être un carré. Puisque la figure n'est pas un carré, pyplot ajoute un espacement supplémentaire entre les axes horizontalement.

Pour contourner ce problème, vous pouvez définir votre silhouette pour qu'elle ait le bon rapport hauteur / largeur. Nous allons utiliser ici l'interface pyplot orientée objet, que je considère comme supérieure en général:

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)

Voici le résultat:

apdnu
la source
3
Merci! votre réponse est simple et fonctionne parfaitement. plt.subplots_adjust(wspace=0, hspace=0)
MohamedEzz
35

Sans recourir entièrement à gridspec , les éléments suivants peuvent également être utilisés pour supprimer les espaces en définissant wspace et hspace sur zéro:

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()

Résultant en:

.

Ingénieur sans herpès
la source
4

Avez-vous essayé plt.tight_layout()?

avec plt.tight_layout() entrez la description de l'image ici sans elle: entrez la description de l'image ici

Ou: quelque chose comme ça (utiliser 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 vous n'avez pas besoin de partager des axes, alors simplement axLS=map(fig.add_axes, rectLS) entrez la description de l'image ici

CT Zhu
la source
J'ai essayé une mise en page serrée, mais cela n'a pas éliminé les lacunes, ce que je veux. La solution gridspec a fonctionné. Merci pour les suggestions.
user3006135
Cela a très bien fonctionné en conjonction avec les autres suggestions. tight_layout () a aidé à supprimer l'espace blanc au-dessus et sur les côtés de l'intrigue qui n'a servi à rien.
DChaps
0

Avec les versions récentes de matplotlib, vous voudrez peut-être essayer la mise en page contrainte . Cela ne fonctionne pas avec plt.subplot()cependant, vous devez donc utiliser à la plt.subplots()place:

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