web-dev-qa-db-fra.com

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

Le code ci-dessous crée des espaces entre les sous-parcelles. Comment puis-je supprimer les espaces entre les sous-parcelles et faire de l'image une grille serrée?

enter image description here

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

Vous pouvez utiliser gridspec pour contrôler l'espacement entre les axes. Il y a plus information 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 very close together

74
Molly

Le problème est l'utilisation de aspect='equal', qui empêche les sous-parcelles 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. Puisque les axes vont de 0 à 1 par défaut (c’est-à-dire avant de tracer quoi que ce soit), utilisez aspect='equal' _ force chaque axe à être un carré. Comme la figure n'est pas un carré, pyplot ajoute un espacement supplémentaire entre les axes horizontalement.

Pour contourner ce problème, vous pouvez configurer votre personnage pour obtenir le rapport de format correct. Nous allons utiliser l'interface pyplot orientée objet ici, 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:

94
Thucydides411

Sans recourir entièrement à gridspec , les éléments suivants pourraient également être utilisés pour supprimer les espaces vides en définissant wspace et hspace à 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:

.

22
KutalmisB

Avez-vous essayé plt.tight_layout()?

avec plt.tight_layout() enter image description here sans ça: enter image description here

Ou: quelque chose comme ça (utilisez 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 les axes, alors simplement axLS=map(fig.add_axes, rectLS) enter image description here

2
CT Zhu