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?
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()
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()
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:
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:
Avez-vous essayé plt.tight_layout()
?
avec plt.tight_layout()
sans ça:
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)