Comment puis-je supprimer les axes supérieur et droit dans matplotlib?

134

Au lieu du style d'axe "encadré" par défaut, je souhaite avoir uniquement les axes gauche et inférieur, c'est-à-dire:

+------+         |
|      |         |
|      |   --->  |
|      |         |
+------+         +-------

Cela devrait être facile, mais je ne trouve pas les options nécessaires dans la documentation.

Michael Kuhn
la source

Réponses:

154

Voici la solution Matplotlib 3 suggérée sur le site officiel ICI :

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, 2*np.pi, 100)
y = np.sin(x)

ax = plt.subplot(111)
ax.plot(x, y)

# Hide the right and top spines
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

# Only show ticks on the left and bottom spines
ax.yaxis.set_ticks_position('left')
ax.xaxis.set_ticks_position('bottom')

plt.show()

entrez la description de l'image ici

divenex
la source
2
C'est la meilleure que la réponse acceptée dans les nouvelles versions de matplotlib.
ffledgling
3
Question supplémentaire pour les débutants: où pouvez-vous trouver cette réponse basée sur la documentation de l'API Matplotlib? Si j'y vais: matplotlib.org/api/axes_api.html je ne vois aucune référence à l' spineobjet, et je n'aurais pas deviné ce mot-clé.
Eric Burel
63

Alternativement, ce

def simpleaxis(ax):
    ax.spines['top'].set_visible(False)
    ax.spines['right'].set_visible(False)
    ax.get_xaxis().tick_bottom()
    ax.get_yaxis().tick_left()

semble obtenir le même effet sur un axe sans perdre le support des étiquettes tournées.

(Matplotlib 1.0.1; solution inspirée de ceci ).

timday
la source
33

[modifier] matplotlib maintenant (2013-10) sur la version 1.3.0 qui inclut ceci

Cette capacité vient d'être ajoutée et vous avez besoin de la version Subversion pour cela. Vous pouvez voir l'exemple de code ici .

Je mets juste à jour pour dire qu'il y a un meilleur exemple en ligne maintenant. Cependant, il faut toujours la version Subversion, il n'y a pas encore eu de version avec cela.

[modifier] Matplotlib 0.99.0 RC1 vient de sortir, et inclut cette capacité.

Autoplectique
la source
Assurez-vous de lire l'avertissement sur matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/… sur le fait que la prise en charge des graduations est incomplète avant d'essayer d'utiliser ce qui précède avec par exemple des étiquettes tournées!
timday
Il semble que cela dépend de la façon dont vous construisez l'axe. Les axes générés par mpl.subplotsne peuvent pas être utilisés de cette manière?
Stefan van der Walt
8
Le lien d'exemple est maintenant rompu.
mkosmala
10

(Il s'agit davantage d'un commentaire d'extension, en plus des réponses complètes ici.)


Notez que nous pouvons masquer chacun de ces trois éléments indépendamment les uns des autres:

  • Pour masquer la bordure (alias «dos»): ax.set_frame_on(False)ouax.spines['top'].set_visible(False)

  • Pour masquer les tiques: ax.tick_params(top=False)

  • Pour masquer les étiquettes: ax.tick_params(labeltop=False)

Evgeni Sergeev
la source
joli résumé des possibilités. +1
aimé.par.Jésus
9

Si vous n'avez pas besoin de graduations et autres (par exemple pour tracer des illustrations qualitatives), vous pouvez également utiliser cette solution de contournement rapide:

Rendez l'axe invisible (par exemple avec plt.gca().axison = False) puis dessinez-les manuellement avec plt.arrow.

nikow
la source
1
cela semble supprimer les épines mais laisser les marques de graduation en place. Une idée de la façon de supprimer les tiques également?
Rob Young
2
@Rob: Vous avez raison, j'ai en fait utilisé une solution différente dans le script auquel je pensais. J'ai changé ma réponse, cela devrait maintenant fonctionner, mais en général, la solution acceptée ci-dessus est meilleure.
nikow
9

La bibliothèque Seaborn a cela intégré avec la fonction despine ().

Il suffit d'ajouter:

import seaborn as sns

Créez maintenant votre graphique. Et ajoutez à la fin:

sns.despine()

Si vous regardez certaines des valeurs de paramètre par défaut de la fonction, cela supprime la colonne vertébrale supérieure et droite et conserve la colonne vertébrale inférieure et gauche:

sns.despine(top=True, right=True, left=False, bottom=False)

Consultez la documentation supplémentaire ici: https://seaborn.pydata.org/generated/seaborn.despine.html

Sander van den Oord
la source
7

Si vous devez le supprimer de tous vos tracés, vous pouvez supprimer les épines dans les paramètres de style (feuille de style ou rcParams). Par exemple:

import matplotlib as mpl

mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False

Si vous souhaitez supprimer toutes les épines:

mpl.rcParams['axes.spines.left'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.bottom'] = False
hhh
la source