web-dev-qa-db-fra.com

la part de matplotlib sur l'axe des x mais ne montre pas les étiquettes de ticks des axes des x

J'utilise python + matplotlib et deux parcelles partagent un axe. Si vous essayez de définir graph1.set_xticklabels([]) lors du partage d'un axe, cela n'aura aucun effet car il est partagé. Existe-t-il un moyen de partager l’axe ET de pouvoir masquer l’axe x d’un tracé?

73
thenickname

Ceci est un piège commun lors de l'utilisation d'axes partagés. 

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

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

Par 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

100
Joe Kington

Par un fil sur matplotlib-users , vous pouvez utiliser

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

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)
9
truhanen

Vous pouvez partager les axes lors de la création d’une sous-parcelle avec plt.subplots as

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

Cela désactivera automatiquement les étiquettes de contrôle des axes internes.

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

2

Malheureusement, je n'ai pas le droit de commenter la réponse d'esmit (qui est la meilleure solution à mon avis, merci esmit), je dois donc écrire mon commentaire comme une nouvelle réponse: j'ai mis 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 moi pour une raison quelconque.

0
Mitch