Comment partager l'axe des x de deux sous-graphiques après leur création?

97

J'essaie de partager deux axes de sous-parcelles, mais je dois partager l'axe des x après la création de la figure. Ainsi, par exemple, je crée cette figure:

import numpy as np
import matplotlib.pyplot as plt

t= np.arange(1000)/100.
x = np.sin(2*np.pi*10*t)
y = np.cos(2*np.pi*10*t)

fig=plt.figure()
ax1 = plt.subplot(211)
plt.plot(t,x)
ax2 = plt.subplot(212)
plt.plot(t,y)

# some code to share both x axis

plt.show()

Au lieu du commentaire, j'insérerais du code pour partager les deux axes x. Je n'ai trouvé aucune idée de la façon dont je peux faire cela. Il y a quelques attributs _shared_x_axeset _shared_x_axesquand je vérifie l'axe de figure ( fig.get_axes()) mais je ne sais pas comment les lier.

ymmx
la source

Réponses:

137

La manière habituelle de partager des axes est de créer les propriétés partagées lors de la création. Soit

fig=plt.figure()
ax1 = plt.subplot(211)
ax2 = plt.subplot(212, sharex = ax1)

ou

fig, (ax1, ax2) = plt.subplots(nrows=2, sharex=True)

Le partage des axes après leur création ne devrait donc pas être nécessaire.

Cependant, si pour une raison quelconque, vous devez partager des axes après leur création (en fait, utiliser une bibliothèque différente qui crée des sous-graphiques, comme ici , ou partager des axes en médaillon pourrait être une raison), il y aurait toujours une solution:

En utilisant

ax1.get_shared_x_axes().join(ax1, ax2)

crée un lien entre les deux axes, ax1et ax2. Contrairement au partage au moment de la création, vous devrez désactiver manuellement les xticklabels pour l'un des axes (au cas où cela serait souhaité).

Un exemple complet:

import numpy as np
import matplotlib.pyplot as plt

t= np.arange(1000)/100.
x = np.sin(2*np.pi*10*t)
y = np.cos(2*np.pi*10*t)

fig=plt.figure()
ax1 = plt.subplot(211)
ax2 = plt.subplot(212)

ax1.plot(t,x)
ax2.plot(t,y)

ax1.get_shared_x_axes().join(ax1, ax2)
ax1.set_xticklabels([])
# ax2.autoscale() ## call autoscale if needed

plt.show()
ImportanceOfErnest
la source
La raison étrange, au fait, est que j'ai sauvegardé des chiffres avec pickle et que je les recharge avec un autre programme qui perd la propriété sharex.
ymmx
4
Ceci est utile pour connecter des sous-graphiques sélectionnés. Par exemple, une figure avec 4 sous-graphiques: deux séries chronologiques et deux histogrammes. Cela vous permet de lier sélectivement les séries chronologiques.
Hamid
2
Documentation de l'API pour l'objet Grouper: matplotlib.org/2.0.2/api/…
michaelosthege
3
Ohh, je viens de comprendre comment annuler le partage d' un axe (ce qui peut être utile dans une grande grille) - sur cet axe, faites-le g = ax.get_shared_y_axes(); g.remove(a) for a in g.get_siblings(ax)]. Merci pour le point de départ!
naught101
3
@ naught101 Vous pouvez simplement appeler ax2.autoscale().
ImportanceOfBeingErnest