88 votes

matplotlib partage l'axe des x mais n'affiche pas les étiquettes de l'axe des x pour les deux, seulement pour l'une d'entre elles

J'utilise python + matplotlib et j'ai deux graphiques qui partagent un axe. Si vous essayez de définir graph1.set_xticklabels([]) tout en partageant un axe, il n'a pas d'effet parce qu'il est partagé. Existe-t-il un moyen de partager l'axe ET de pouvoir masquer l'axe des x d'un tracé ?

124voto

Joe Kington Points 68089

Il s'agit d'un problème courant lors de l'utilisation d'axes partagés.

Heureusement, il existe une solution simple : utiliser plt.setp(ax.get_xticklabels(), visible=False) pour rendre les étiquettes invisibles sur un seul axe.

Cela équivaut à [label.set_visible(False) for label in ax.get_xticklabels()] pour ce que cela vaut. setp fonctionnera automatiquement sur un itérable d'objets matplotlib, ainsi que sur des objets individuels.

A titre d'exemple :

import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax1.plot(range(10), 'b-')

ax2 = fig.add_subplot(2,1,2, sharex=ax1)
ax2.plot(range(10), 'r-')

plt.setp(ax1.get_xticklabels(), visible=False)

plt.show()

alt text

9 votes

J'ai eu le problème inverse : les étiquettes du second sous-graphe ne s'affichaient pas. J'ai donc utilisé votre commande comme suit : plt.setp(ax2.get_yticklabels(), visible=True) . Il a fonctionné sans problème.

52voto

esmit Points 391

Selon un fil de discussion sur matplotlib-users vous pouvez utiliser

import matplotlib.pyplot as plt
for ax in plt.gcf().axes:
    try:
        ax.label_outer()
    except:
        pass

1 votes

J'aimerais pouvoir donner plus de notes à cette réponse, parce qu'elle est bien plus utile que la réponse acceptée. La seule situation dans laquelle vous voulez modifier la visibilité au lieu de l'éliminer est celle des intrigues secondaires ; et votre réponse est beaucoup plus intelligente dans ce cas. Merci de votre compréhension.

0 votes

Pourquoi la try nécessaires ? Il semble que tout aille bien sans cela.

2 votes

try est nécessaire parce que tous les éléments de la plt.gcf().axes sont garantis pour être subplot (avec un label_outer ).

33voto

truhanen Points 403

Vous pouvez utiliser Axes.tick_params() :

import matplotlib.pyplot as plt

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

ax1.tick_params(labelbottom=False)

6voto

Vous pouvez partager les axes lors de la création d'un sous-graphe à l'aide de la fonction plt.subplots comme

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

Cela désactivera automatiquement les étiquettes pour les axes intérieurs.

Exemple complet :

import matplotlib.pyplot as plt

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

axes[0].plot([1,2,3])
axes[1].plot([3,2,1])

plt.show()

enter image description here

1voto

Mitch Points 51

Malheureusement, je ne suis pas autorisé à commenter la réponse d'esmit (qui est la meilleure solution à mon avis, merci esmit), je dois donc rédiger mon commentaire comme une nouvelle réponse : J'ai intégré sa solution dans une fonction simple

def remove_inner_ticklabels(fig):
    for ax in fig.axes:
        try:
            ax.label_outer()
        except:
            pass

que vous pouvez appeler avant plt.show() . La réponse de Joe Kington n'a pas fonctionné pour une raison quelconque.

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