144 votes

Comment partager les axes x de deux sous-plans après leur création ?

J'essaie de partager les axes de deux sous-plots, mais j'ai besoin de partager l'axe x après la création de la figure. 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 axes

plt.show()

Au lieu du commentaire, je veux insérer un code pour partager les deux axes x. Comment dois-je m'y prendre ? Il y a quelques attributs de sondage pertinents _shared_x_axes y _shared_x_axes lorsque je vérifie l'axe des chiffres ( fig.get_axes() ) mais je ne sais pas comment les relier.

224voto

ImportanceOfBeingErnest Points 119438

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.

Toutefois, si pour une raison quelconque, vous devez partager des axes après leur création (en fait, en utilisant une bibliothèque différente qui crée des sous-plots, comme aquí pourrait être une raison), il y aurait toujours une solution :

Utilisation de

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

crée un lien entre les deux axes, ax1 y 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()

L'autre réponse contient un code pour traiter une liste d'axes. :

axes[0].get_shared_x_axes().join(axes[0], *axes[1:])

1 votes

La raison étrange, d'ailleurs, est que j'ai sauvegardé certaines figures avec pickle et je les recharge avec un autre programme qui perd la propriété sharex.

9 votes

Ceci est utile pour connecter des sous-plots sélectionnés. Par exemple, une figure comportant 4 sous-plages : deux séries temporelles et deux histogrammes. Cela vous permet de relier sélectivement les séries temporelles.

4 votes

Documentation de l'API pour l'objet Grouper : matplotlib.org/2.0.2/api/

32voto

ukemi Points 3499

À partir de Matplotlib v3.3 il existe désormais Axes.sharex , Axes.sharey méthodes :

ax1.sharex(ax2)
ax1.sharey(ax3)

6voto

pfabri Points 127

Juste pour ajouter à la réponse de ImportanceOfBeingErnest ci-dessus :

Si vous avez un list d'objets axes, vous pouvez les passer tous en même temps et partager leurs axes en décomposant la liste comme suit :

ax_list = [ax1, ax2, ... axn] #< your axes objects 
ax_list[0].get_shared_x_axes().join(ax_list[0], *ax_list)

Ce qui précède les reliera tous entre eux. Bien sûr, vous pouvez être créatif et sous-régler votre list de ne relier que certains d'entre eux.

Nota:

Afin d'avoir tous les axes liés entre eux, vous devez inclure le premier élément de l'élément axes_list dans l'appel, malgré le fait que vous invoquez .get_shared_x_axes() sur le premier élément pour commencer !

Donc, en faisant cela, ce qui semblerait certainement logique :

ax_list[0].get_shared_x_axes().join(ax_list[0], *ax_list[1:])

... aura pour effet de relier tous les axes les objets ensemble sauf le premier, qui restera entièrement indépendant des autres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X