riducendo il numero di tick della trama


160

Ho troppi segni di spunta sul mio grafico e si incontrano.

Come posso ridurre il numero di tick?

Ad esempio, ho delle zecche:

1E-6, 1E-5, 1E-4, ... 1E6, 1E7

E voglio solo:

1E-5, 1E-3, ... 1E5, 1E7

Ho provato a giocare con il LogLocator, ma non sono stato in grado di capirlo.

Risposte:


266

In alternativa, se si desidera semplicemente impostare il numero di tick, consentendo a matplotlib di posizionarli (attualmente solo con MaxNLocator), è possibile pyplot.locator_params,

pyplot.locator_params(nbins=4)

È possibile specificare un asse specifico in questo metodo come indicato di seguito, il valore predefinito è entrambi:

# To specify the number of ticks on both or any single axes
pyplot.locator_params(axis='y', nbins=6)
pyplot.locator_params(axis='x', nbins=10)

27
Questo è stato un grande suggerimento, essendo anche in grado di specificare pyplot.locator_params(axis = 'x', nbins = 4)(o axis = 'y') rendere il processo davvero semplice. Grazie @bgamari!
benjaminmgross,

8
Con la scala dei tronchi, questo ha funzionato numticksinvece dinbins
meduz

1
@bgamari, potresti aggiungere la numtickssoluzione per i grafici logaritmici, come sottolineato da @meduz?
Løiten,

7
Questo non sembra posizionare le etichette dove dovrebbero essere. Ad esempio, se le etichette di spunta originali sono [0, 1, ..., 99]e ora si imposta nticks=10, le nuove etichette sparse verranno posizionate dieci volte più a lungo lungo l'asse, cioè ora 1siederà dove 9era, 2dove 19era ... e 9dove 99era.
Vim

2
Controlla i risultati prima di affidarti a questo metodo. @Vim è corretto. I valori di spunta verranno inseriti in modo errato.
David J.

54

Se qualcuno ottiene ancora questa pagina nei risultati di ricerca:

fig, ax = plt.subplots()

plt.plot(...)

every_nth = 4
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        label.set_visible(False)

7
Questo in realtà ha funzionato rispetto a tutte le altre risposte che non hanno fatto nulla. grazie :)
faizan

Molto bene. Mi ci è voluto un po 'per trovare questo, ma ha fatto quello che volevo.
Giovanni,

Grazie, ciò garantisce che le etichette rimaste siano nelle posizioni corrette. Un ulteriore passaggio che migliorerebbe questa risposta è rimuovere anche il segno di spunta.
David J.

Ottima risposta semplice - non ha sorpreso nessun metodo personalizzato noto alla comunità SO. Questa sarebbe una preziosa aggiunta alla lib?
jabberwocky,

32

Per risolvere il problema della personalizzazione e l'aspetto delle zecche, vedere il Tick Locator guida sul sito matplotlib

ax.xaxis.set_major_locator(plt.MaxNLocator(3))

Impostarebbe il numero totale di tick nell'asse x su 3 e lo distribuirà uniformemente sull'asse.

C'è anche un bel tutorial su questo


Seleziona solo i primi 3 indici datetime. quando ottieni l'ascia da Panda.DataFrame.plot ax = df.plot()
Mithril

@Mithril scusa non capisco bene il tuo commento. Potresti per favore elaborare?
Prageeth Jayathissa,

Se ho un df ( pandas.DataFrame) con indice datetime [2019-01-01, ... 2019-11-01], chiama ax = df.plot(), restituisce un oggetto figura. call ax.xaxis.set_major_locator(plt.MaxNLocator(3)) mostra solo i primi 3 indici [2019-01-01, 2019-01-02, 2019-01-03].
Mithril,

1
@Mithril, df.plot()spesso visualizza il minor_locator, quindi potresti provare ax1.xaxis.set_minor_locator(plt.MaxNLocator(3)). Ricorda inoltre di sostituire il 3numero di tick che desideri visualizzare. Per i periodi di panda che consiglio import matplotlib.dates as mdatese corro ax.xaxis.set_minor_locator(mdates.MonthLocator(interval = 1))conax.xaxis.set_minor_formatter(mdates.DateFormatter('%m-%Y'))
Prageeth Jayathissa,

20

C'è una set_ticks()funzione per gli oggetti degli assi.


4
Funzionerebbe se avessi saputo in anticipo cosa volevo. L'esempio che ho dato sopra era solo un esempio. Non so quali siano le zecche, so solo che ne voglio meno, cioè tutte le altre.
jlconlin,

10
È possibile chiamare get_xticks()o get_yticks()prima l'oggetto axes, modificarlo in base alle esigenze, quindi passare di nuovo l'elenco a set_ticks().
user812786,

4
Non ho set_ticks(), ma ho set_xticks()e set_yticks(). Questi sono attributi degli oggetti degli assi, non degli assi. Forse questo è cambiato negli ultimi due anni.
Gauthier,

2
Non sono sicuro che dovrei, alcune persone hanno trovato la tua risposta utile com'è, e solo perché è diversa per me non significa che sia per tutti.
Gauthier,

1
Un esempio farebbe molto per rendere utile questa risposta.
Richard,

10

nel caso in cui qualcuno ne abbia ancora bisogno, e poiché nulla qui ha funzionato davvero per me, ho trovato un modo molto semplice che mantiene l'aspetto del diagramma generato "così com'è", fissando il numero di tick esattamente su N:

import numpy as np
import matplotlib.pyplot as plt

f, ax = plt.subplots()
ax.plot(range(100))

ymin, ymax = ax.get_ylim()
ax.set_yticks(np.round(np.linspace(ymin, ymax, N), 2))

2
Ho dovuto modificare leggermente l'ultima riga per ottenere che restituisca i valori come int anziché float:ax.set_yticks(np.linspace(int(ymin), int(ymax), N), 2)
Nick Settje

@NickSettje galleggia ancora con me!
Mohd

4

La soluzione fornita da @raphael è semplice e molto utile.

Tuttavia, le etichette di spunta visualizzate non saranno valori campionati dalla distribuzione originale ma dagli indici dell'array restituiti da np.linspace(ymin, ymax, N).

Per visualizzare N valori distribuiti uniformemente dalle etichette di spunta originali, utilizzare il set_yticklabels()metodo Ecco uno snippet per l'asse y, con etichette intere:

import numpy as np
import matplotlib.pyplot as plt

ax = plt.gca()

ymin, ymax = ax.get_ylim()
custom_ticks = np.linspace(ymin, ymax, N, dtype=int)
ax.set_yticks(custom_ticks)
ax.set_yticklabels(custom_ticks)

Complimenti per questa bella modifica!
Mohd

2

Quando viene utilizzata una scala di registro, è possibile correggere il numero di tick maggiori con il comando seguente

import matplotlib.pyplot as plt

....

plt.locator_params(numticks=12)
plt.show()

Il valore impostato su numticksdetermina il numero di tick dell'asse da visualizzare.

Ringraziamenti al post di @ bgamari per l'introduzione della locator_params()funzione, ma il nticksparametro genera un errore quando viene utilizzata una scala di registro.


La domanda e la risposta sono per matplotlib precedente, ovvero 1, e ti riferisci a 2.
Dawid Laszuk,
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.