Qual è la differenza tra "log" e "symlog"?


101

In matplotlib , posso impostare il ridimensionamento degli assi usando pyplot.xscale()o Axes.set_xscale(). Entrambe le funzioni accettano tre scale differenti: 'linear'| 'log'| 'symlog'.

Qual'è la differenza tra 'log'e 'symlog'? In un semplice test che ho fatto, sembravano entrambi esattamente uguali.

So che la documentazione dice che accettano parametri diversi, ma ancora non capisco la differenza tra loro. Qualcuno può spiegarlo per favore? La risposta sarà la migliore se avrà del codice e della grafica di esempio! (anche: da dove viene il nome 'symlog'?)

Risposte:


188

Ho finalmente trovato il tempo per fare alcuni esperimenti per capire la differenza tra loro. Ecco cosa ho scoperto:

  • logconsente solo valori positivi e consente di scegliere come gestire quelli negativi ( masko clip).
  • symlogsignifica log simmetrico e consente valori positivi e negativi.
  • symlog permette di impostare un range intorno allo zero all'interno del grafico sarà lineare invece che logaritmico.

Penso che tutto diventerà molto più facile da capire con grafici ed esempi, quindi proviamoli:

import numpy
from matplotlib import pyplot

# Enable interactive mode
pyplot.ion()

# Draw the grid lines
pyplot.grid(True)

# Numbers from -50 to 50, with 0.1 as step
xdomain = numpy.arange(-50,50, 0.1)

# Plots a simple linear function 'f(x) = x'
pyplot.plot(xdomain, xdomain)
# Plots 'sin(x)'
pyplot.plot(xdomain, numpy.sin(xdomain))

# 'linear' is the default mode, so this next line is redundant:
pyplot.xscale('linear')

Un grafico che utilizza il ridimensionamento "lineare"

# How to treat negative values?
# 'mask' will treat negative values as invalid
# 'mask' is the default, so the next two lines are equivalent
pyplot.xscale('log')
pyplot.xscale('log', nonposx='mask')

Un grafico che utilizza il ridimensionamento 'log' e nonposx = 'mask'

# 'clip' will map all negative values a very small positive one
pyplot.xscale('log', nonposx='clip')

Un grafico che utilizza il ridimensionamento 'log' e nonposx = 'clip'

# 'symlog' scaling, however, handles negative values nicely
pyplot.xscale('symlog')

Un grafico che utilizza il ridimensionamento "symlog"

# And you can even set a linear range around zero
pyplot.xscale('symlog', linthreshx=20)

Un grafico che utilizza il ridimensionamento 'symlog', ma lineare entro (-20,20)

Solo per completezza, ho usato il seguente codice per salvare ogni figura:

# Default dpi is 80
pyplot.savefig('matplotlib_xscale_linear.png', dpi=50, bbox_inches='tight')

Ricorda che puoi modificare la dimensione della figura utilizzando:

fig = pyplot.gcf()
fig.set_size_inches([4., 3.])
# Default size: [8., 6.]

(Se non sei sicuro che risponda alla mia domanda, leggi questo )


19

symlog è come log ma consente di definire un intervallo di valori vicino allo zero entro il quale il grafico è lineare, per evitare che il grafico vada all'infinito intorno allo zero.

Da http://matplotlib.sourceforge.net/api/axes_api.html#matplotlib.axes.Axes.set_xscale

In un grafico logaritmico, non puoi mai avere un valore zero, e se hai un valore che si avvicina a zero, aumenterà verso il basso dal fondo del grafico (infinitamente verso il basso) perché quando prendi "log (prossimo allo zero)" ottenere "avvicinandosi all'infinito negativo".

symlog ti aiuterebbe nelle situazioni in cui vuoi avere un grafico di log, ma quando il valore a volte può scendere verso, o fino a zero, ma vuoi comunque essere in grado di mostrarlo sul grafico in modo significativo. Se hai bisogno di symlog, lo sapresti.


Beh ... l'ho letto, ma ancora non so quando dovrei usarne uno o l'altro. Mi aspettavo una sorta di esempio grafico in modo da poter effettivamente vedere qual è il problema che symlog cerca di risolvere.
Denilson Sá Maia

4

Ecco un esempio di comportamento quando è necessario symlog:

Grafico iniziale, non in scala. Notare quanti punti si raggruppano in x ~ 0

    ax = sns.scatterplot(x= 'Score', y ='Total Amount Deposited', data = df, hue = 'Predicted Category')

[ Non in scala "

Grafico in scala del registro. Tutto è crollato.

    ax = sns.scatterplot(x= 'Score', y ='Total Amount Deposited', data = df, hue = 'Predicted Category')

    ax.set_xscale('log')
    ax.set_yscale('log')
    ax.set(xlabel='Score, log', ylabel='Total Amount Deposited, log')

Scala del registro '

Perché è crollato? A causa di alcuni valori sull'asse x molto vicini o uguali a 0.

Grafico in scala di Symlog. Tutto è come dovrebbe essere.

    ax = sns.scatterplot(x= 'Score', y ='Total Amount Deposited', data = df, hue = 'Predicted Category')

    ax.set_xscale('symlog')
    ax.set_yscale('symlog')
    ax.set(xlabel='Score, symlog', ylabel='Total Amount Deposited, symlog')

Scala di Symlog

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.