Come posso rimuovere l'asse superiore e destro in matplotlib?


133

Invece dello stile predefinito dell'asse "inscatolato" voglio avere solo l'asse sinistro e inferiore, ovvero:

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

Dovrebbe essere facile, ma non riesco a trovare le opzioni necessarie nei documenti.

Risposte:


153

Questa è la soluzione Matplotlib 3 suggerita dal sito ufficiale QUI :

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()

inserisci qui la descrizione dell'immagine


2
Questa è la migliore della risposta accettata nelle nuove versioni di matplotlib.
Sfogliando il

3
Domanda aggiuntiva per i principianti: dove puoi trovare questa risposta in base al documento API Matplotlib? Se ci vado: matplotlib.org/api/axes_api.html Non vedo alcun riferimento spineall'oggetto e non avrei indovinato questa parola chiave.
Eric Burel,

63

In alternativa, questo

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()

sembra ottenere lo stesso effetto su un asse senza perdere il supporto dell'etichetta ruotata.

(Matplotlib 1.0.1; soluzione ispirata da questo ).


33

[modifica] matplotlib ora (2013-10) sulla versione 1.3.0 che include questo

Quell'abilità è stata appena aggiunta e per questo ti serve la versione di Subversion. Puoi vedere il codice di esempio qui .

Sto solo aggiornando per dire che ora c'è un esempio migliore online. Tuttavia è ancora necessaria la versione di Subversion, non è stata ancora rilasciata una versione con questo.

[modifica] Matplotlib 0.99.0 RC1 è stato appena rilasciato e include questa funzionalità.


Assicurati di leggere l'avvertenza su matplotlib.sourceforge.net/mpl_toolkits/axes_grid/users/… riguardo al fatto che il supporto dei segni di spunta sia incompleto prima di provare a usare quanto sopra con ad esempio etichette ruotate!
martedì

Sembra che dipenda da come costruisci l'asse. Gli assi generati da mpl.subplotsnon possono essere utilizzati in questo modo?
Stefan van der Walt,

8
Il collegamento di esempio ora è interrotto.
mkosmala,

10

(Questo è più di un commento di estensione, oltre alle risposte complete qui.)


Nota che possiamo nascondere ciascuno di questi tre elementi indipendentemente l'uno dall'altro:

  • Per nascondere il bordo (alias "dorso"): ax.set_frame_on(False)oax.spines['top'].set_visible(False)

  • Per nascondere le zecche: ax.tick_params(top=False)

  • Per nascondere le etichette: ax.tick_params(labeltop=False)


bel riassunto delle possibilità. +1
amato da Gesù, il

9

Se non hai bisogno di segni di spunta e simili (ad esempio per la stampa di illustrazioni qualitative) puoi anche usare questa soluzione rapida:

Rendi l'asse invisibile (ad es. Con plt.gca().axison = False) e poi disegnali manualmente con plt.arrow.


1
questo sembra rimuovere le spine ma lasciare i segni di spunta in posizione. Qualche idea su come rimuovere anche le zecche?
Rob Young,

2
@Rob: hai ragione, in realtà ho usato una soluzione diversa nella sceneggiatura a cui stavo pensando. Ho cambiato la mia risposta, ora dovrebbe funzionare, ma in generale la soluzione accettata sopra è migliore.
nikow,

9

La libreria Seaborn ha questo integrato con la funzione despine ().

Aggiungi solo:

import seaborn as sns

Ora crea il tuo grafico. E aggiungi alla fine:

sns.despine()

Se osservi alcuni dei valori dei parametri predefiniti della funzione, rimuove la colonna vertebrale superiore e destra e mantiene la colonna vertebrale inferiore e sinistra:

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

Consulta la documentazione aggiuntiva qui: https://seaborn.pydata.org/generated/seaborn.despine.html


7

Se è necessario rimuoverlo da tutti i grafici, è possibile rimuovere le spine dorsali nelle impostazioni di stile (foglio di stile o rcParams). Per esempio:

import matplotlib as mpl

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

Se si desidera rimuovere tutte le spine:

mpl.rcParams['axes.spines.left'] = False
mpl.rcParams['axes.spines.right'] = False
mpl.rcParams['axes.spines.top'] = False
mpl.rcParams['axes.spines.bottom'] = False
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.