Masquage du texte de l'axe dans les tracés matplotlib

370

J'essaie de tracer une figure sans coche ni numéro sur l'un ou l'autre des axes (j'utilise des axes au sens traditionnel, pas la nomenclature matplotlib!). Un problème que j'ai rencontré est celui où matplotlib ajuste les graduations x (y) en soustrayant une valeur N, puis ajoute N à la fin de l'axe.

Cela peut être vague, mais l'exemple simplifié suivant met en évidence le problème, avec «6,18» étant la valeur incriminée de N:

import matplotlib.pyplot as plt
import random
prefix = 6.18

rx = [prefix+(0.001*random.random()) for i in arange(100)]
ry = [prefix+(0.001*random.random()) for i in arange(100)]
plt.plot(rx,ry,'ko')

frame1 = plt.gca()
for xlabel_i in frame1.axes.get_xticklabels():
    xlabel_i.set_visible(False)
    xlabel_i.set_fontsize(0.0)
for xlabel_i in frame1.axes.get_yticklabels():
    xlabel_i.set_fontsize(0.0)
    xlabel_i.set_visible(False)
for tick in frame1.axes.get_xticklines():
    tick.set_visible(False)
for tick in frame1.axes.get_yticklines():
    tick.set_visible(False)

plt.show()

Les trois choses que j'aimerais savoir sont:

  1. Comment désactiver ce comportement en premier lieu (bien que dans la plupart des cas cela soit utile, ce n'est pas toujours le cas!) J'ai regardé à travers matplotlib.axis.XAxiset je ne trouve rien de approprié

  2. Comment puis-je faire disparaître N (ie X.set_visible(False))

  3. Existe-t-il de toute façon une meilleure façon de procéder? Mon intrigue finale serait des sous-intrigues 4x4 dans une figure, si cela est pertinent.

Dave
la source
J'ai un petit doute si l'une des réponses ici répond réellement à la question. Pour moi, il semble que la question demande comment se débarrasser du décalage . Pourtant, toutes les réponses montrent différentes façons de se débarrasser de tous les ticklabels. Si la question a été dépassée par les réponses, peut-être faudrait-il modifier la question pour demander à quoi les réponses apportent des solutions?
ImportanceOfBeingErnest

Réponses:

471

Au lieu de masquer chaque élément, vous pouvez masquer l'axe entier:

frame1.axes.get_xaxis().set_visible(False)
frame1.axes.get_yaxis().set_visible(False)

Ou, vous pouvez définir les graduations sur une liste vide:

frame1.axes.get_xaxis().set_ticks([])
frame1.axes.get_yaxis().set_ticks([])

Dans cette deuxième option, vous pouvez toujours utiliser plt.xlabel()et plt.ylabel()pour ajouter des étiquettes aux axes.

Ofri Raviv
la source
2
Hé Ofri - c'est super, merci, mais maintenant (juste pour être maladroit) que se passe-t-il si je veux ajouter un xlabel ()? Autre que de placer manuellement un widget de texte.
Dave
5
Comment pouvez-vous étendre cet exemple à la 3D? ax = plt.gca (projection = '3d'), ax.axes.get_zaxis (). set_visible (False) donne'Axes3DSubplot' object has no attribute 'get_zaxis'
user989762
13
Cette réponse ne permet pas aux lignes de la grille de s'afficher. La réponse de @saullo castro fait cependant ...
evan54
Le problème est que lorsque x_axis est défini sur invisible, la grille disparaît :( Edit: Je viens de voir la réponse de @Saullo Castro qui a résolu le problème.
Shailen
1
@ user989762 Dans votre cas, cette méthode ne fonctionnera pas, pas même get_xaxis().set_visible(False). Je pense que matplotlib dans ce cas initialise certains paramètres comme si le tracé était 2D. ax.set_zticks([])fera ce que vous voulez
kon psych
222

Si vous souhaitez masquer uniquement le texte de l'axe en conservant les lignes de la grille:

frame1 = plt.gca()
frame1.axes.xaxis.set_ticklabels([])
frame1.axes.yaxis.set_ticklabels([])

Faire set_visible(False)ou masquera set_ticks([])également les lignes de la grille.

Saullo GP Castro
la source
4
cela supprime les étiquettes de toutes les sous-parcelles qui partagent cet axe: /
endolith
136

Si vous êtes comme moi et que vous ne récupérez pas toujours les axes ax, lorsque vous tracez la figure, alors une solution simple serait de faire

plt.xticks([])
plt.yticks([])
Ébe Isaac
la source
56

Un peu d'un ancien thread mais, cela semble être une méthode plus rapide utilisant la dernière version de matplotlib:

définir le formateur principal pour l'axe des x

ax.xaxis.set_major_formatter(plt.NullFormatter())
Nik Twerdochlib
la source
1
Et si vous ne voulez le faire que pour une seule tique?
tommy.carstensen
5
Oui, cela est utile pour masquer uniquement les étiquettes, car .set_xticks ([]) supprime également les graduations elles-mêmes.
zbyszek
49

Je n'ai pas été en mesure de rendre une image sans bordures ni données d'axe sur la base des extraits de code ici (même celui accepté dans la réponse). Après avoir fouillé dans la documentation de l'API, j'ai atterri sur ce code pour rendre mon image

plt.axis('off')
plt.tick_params(axis='both', left='off', top='off', right='off', bottom='off', labelleft='off', labeltop='off', labelright='off', labelbottom='off')
plt.savefig('foo.png', dpi=100, bbox_inches='tight', pad_inches=0.0)

J'ai utilisé l' tick_paramsappel pour fermer essentiellement toutes les informations supplémentaires qui pourraient être rendues et j'ai un graphique parfait dans mon fichier de sortie.

GingerLoaf
la source
1
Lorsque les axes sont partagés, les solutions basées sur set_ticklabels se propagent sur les axes partagés. Seule cette solution basée sur tick_params fonctionnait bien pour moi.
Christian O'Reilly
39

J'ai codé par couleur cette figure pour faciliter le processus.

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)

entrez la description de l'image ici

Vous pouvez avoir un contrôle total sur la figure à l'aide de ces commandes, pour compléter la réponse, j'ai également ajouté le contrôle sur les splines:

ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# X AXIS -BORDER
ax.spines['bottom'].set_visible(False)
# BLUE
ax.set_xticklabels([])
# RED
ax.set_xticks([])
# RED AND BLUE TOGETHER
ax.axes.get_xaxis().set_visible(False)

# Y AXIS -BORDER
ax.spines['left'].set_visible(False)
# YELLOW
ax.set_yticklabels([])
# GREEN
ax.set_yticks([])
# YELLOW AND GREEN TOGHETHER
ax.axes.get_yaxis().set_visible(False)
GM
la source
ax.set_xticklabels([])et ax.set_xticks([])n'a pas fonctionné pour moi, mais l'a ax.axes.get_xaxis().set_visible(False)fait.
Homero Esmeraldo
2
cela devrait être la réponse acceptée
Jason S
6

Lorsque vous utilisez l'API orientée objet, l' Axesobjet dispose de deux méthodes utiles pour supprimer le texte de l'axe, set_xticklabels()et set_xticks().

Supposons que vous créez un tracé en utilisant

fig, ax = plt.subplots(1)
ax.plot(x, y)

Si vous souhaitez simplement supprimer les étiquettes de coche, vous pouvez utiliser

ax.set_xticklabels([])

ou pour éliminer complètement les tiques, vous pouvez utiliser

ax.set_xticks([])

Ces méthodes sont utiles pour spécifier exactement où vous voulez les tiques et comment vous voulez les étiqueter. Passer une liste vide n'entraîne respectivement ni ticks, ni étiquettes.

Steven C. Howell
la source
2

Une astuce pourrait être de définir la couleur des étiquettes de ticks comme blanc pour le cacher!

plt.xticks(color='w')
plt.yticks(color='w')
Venkatachalam
la source