Comment partager l'axe x de deux parcelles après leur création?

j'essaie de partager deux sous-lots de l'axe, mais j'ai besoin de partager l'axe x après que la figure ait été créée. 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 un code pour partager les deux axes X. Je n'ai trouvé aucune idée de comment je peux faire ça. Il y a quelques attributs _shared_x_axes et _shared_x_axes quand je vérifie l'axe de la figure ( fig.get_axes() ) mais je ne sais pas comment les relier.

27
demandé sur ymmx 2017-03-23 13:20:47

1 réponses

la façon 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 n'importe quelle raison ,vous devez partager les axes après qu'ils aient été créés (en fait, en utilisant une bibliothèque différente qui crée quelques sous-lots, comme ici , ou partager un axe en médaillon pourrait être une raison), il y aurait encore une solution:

utilisant

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

crée un lien entre les deux axes, ax1 et ax2 . Contrairement au partage au moment de la création, vous devrez désactiver les labels xticklabels manuellement 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()
37
répondu ImportanceOfBeingErnest 2018-08-08 14:29:12