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.