Traccia gli assi logaritmici con matplotlib in pitone


369

Voglio tracciare un grafico con un asse logaritmico usando matplotlib.

Ho letto i documenti, ma non riesco a capire la sintassi. So che probabilmente è qualcosa di semplice come 'scale=linear'negli argomenti della trama, ma non riesco a farlo bene

Programma di esempio:

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)
pylab.show()

Risposte:


384

Puoi usare il Axes.set_yscalemetodo Ciò consente di modificare la scala dopo la Axescreazione dell'oggetto. Ciò consentirebbe anche di creare un controllo per consentire all'utente di scegliere la scala se necessario.

La riga pertinente da aggiungere è:

ax.set_yscale('log')

È possibile utilizzare 'linear'per tornare a una scala lineare. Ecco come sarebbe il tuo codice:

import pylab
import matplotlib.pyplot as plt
a = [pow(10, i) for i in range(10)]
fig = plt.figure()
ax = fig.add_subplot(2, 1, 1)

line, = ax.plot(a, color='blue', lw=2)

ax.set_yscale('log')

pylab.show()

tabella dei risultati


6
Questo metodo è utile poiché funziona con tutti i tipi di grafici (ad esempio istogrammi), non solo con "trama" (che è ciò che fa la semilogia / semilogia)
Tim Whitcomb,

16
Sono venuto qui alla ricerca di come utilizzare un asse per potenze di due: pylab.gca (). Set_xscale ('log', basex = 2)
zje,

53
Matplotlib ha semilogy(). Inoltre, è più facile da usare direttamente pyplot.yscale()che da usare ax.set_yscale('log'), in quanto non è necessario ottenere l' axoggetto (che non è sempre immediatamente disponibile).
Eric O Lebigot,

5
Se vuoi le scale di registro su entrambi gli assi, prova loglog()o sull'asse X prova solosemilogx()
drevicko,

10
@EOL Consiglierei il contrario. È meglio usare un axoggetto esplicito che usare pyplotche potrebbe applicarsi solo agli assi che si desidera.
Tacaswell,

288

Prima di tutto, non è molto ordinato mescolare pylabe pyplotcodificare. Inoltre, lo stile pyplot è preferito rispetto all'utilizzo di pylab .

Ecco un codice leggermente ripulito, usando solo le pyplotfunzioni:

from matplotlib import pyplot

a = [ pow(10,i) for i in range(10) ]

pyplot.subplot(2,1,1)
pyplot.plot(a, color='blue', lw=2)
pyplot.yscale('log')
pyplot.show()

La funzione rilevante è pyplot.yscale(). Se si utilizza la versione orientata agli oggetti, sostituirla con il metodo Axes.set_yscale(). Ricorda che puoi anche cambiare la scala dell'asse X, usando pyplot.xscale()(o Axes.set_xscale()).

Verifica la mia domanda Qual è la differenza tra 'log' e 'symlog'? per vedere alcuni esempi delle scale del grafico offerte da matplotlib.


Ho avuto difficoltà a cercare di capire come farlo. Questa risposta mi ha salvato la giornata!
HWende,

13
pyplot.semilogy()è più diretto.
Eric O Lebigot,

64

Devi semplicemente usare la semilogia anziché la trama:

from pylab import *
import matplotlib.pyplot  as pyplot
a = [ pow(10,i) for i in range(10) ]
fig = pyplot.figure()
ax = fig.add_subplot(2,1,1)

line, = ax.semilogy(a, color='blue', lw=2)
show()

1
LOL, stavo provando il registro (FloatArray) per il tempo, grazie per avermi salvato la giornata
Pradeep,

5
C'è anche la semilogx . Se è necessario accedere ad entrambi gli assi, utilizzare loglog
drevicko il

40

se vuoi cambiare la base del logaritmo, aggiungi semplicemente:

plt.yscale('log',basey=2) 
# where basex or basey are the bases of log

8

So che questo è leggermente fuori tema, poiché alcuni commenti hanno menzionato la ax.set_yscale('log')soluzione "più bella" che pensavo potesse essere dovuta a una confutazione. Non consiglierei l'uso ax.set_yscale('log')per istogrammi e grafici a barre. Nella mia versione (0.99.1.1) mi imbatto in alcuni problemi di rendering - non sono sicuro di quanto sia generale questo problema. Tuttavia sia bar che hist hanno argomenti opzionali per impostare la scala y su log, che funzionano bene.

riferimenti: http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.bar

http://matplotlib.org/api/pyplot_api.html#matplotlib.pyplot.hist


5

Quindi, se stai semplicemente usando l'API non sofisticata, come lo sono spesso (lo uso molto in ipython), allora questo è semplicemente

yscale('log')
plot(...)

Spero che questo aiuti qualcuno che cerca una risposta semplice! :).


-1

Puoi usare il codice seguente:

np.log(df['col_whose_log_you_need']).iplot(kind='histogram', bins=100,
                                   xTitle = 'log of col',yTitle ='Count corresponding to column',
                                   title='Distribution of log(col_whose_log_you_need)')
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.