¿Cuál es la diferencia entre 'log' y 'symlog'?

101

En matplotlib , puedo establecer la escala del eje usando pyplot.xscale()o Axes.set_xscale(). Ambas funciones aceptan tres escalas diferentes: 'linear'| 'log'| 'symlog'.

¿Cuál es la diferencia entre 'log'y 'symlog'? En una simple prueba que hice, ambos se veían exactamente iguales.

Sé que la documentación dice que aceptan diferentes parámetros, pero todavía no entiendo la diferencia entre ellos. ¿Alguien puede explicarlo? La respuesta será la mejor si tiene algún código de muestra y gráficos. (también: ¿de dónde viene el nombre 'symlog'?)

Denilson Sá Maia
fuente

Respuestas:

188

Finalmente encontré algo de tiempo para hacer algunos experimentos a fin de comprender la diferencia entre ellos. Esto es lo que descubrí:

  • logsolo permite valores positivos y le permite elegir cómo manejar los negativos ( masko clip).
  • symlogsignifica logaritmo simétrico y permite valores positivos y negativos.
  • symlog permite establecer un rango alrededor de cero dentro de la gráfica será lineal en lugar de logarítmico.

Creo que todo será mucho más fácil de entender con gráficos y ejemplos, así que probémoslos:

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 gráfico que utiliza una escala 'lineal'

# 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 gráfico que usa escala 'log' y nonposx = 'máscara'

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

Un gráfico que usa escala 'log' y nonposx = 'clip'

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

Un gráfico que usa escalado 'symlog'

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

Un gráfico que usa escalado 'symlog', pero lineal dentro de (-20,20)

Solo para completar, he usado el siguiente código para guardar cada figura:

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

Recuerda que puedes cambiar el tamaño de la figura usando:

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

(Si no está seguro de que responda mi propia pregunta, lea esto )

Denilson Sá Maia
fuente
19

symlog es como log pero le permite definir un rango de valores cercanos a cero dentro del cual la gráfica es lineal, para evitar que la gráfica vaya al infinito alrededor de cero.

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

En una gráfica logarítmica, nunca puede tener un valor cero, y si tiene un valor que se acerca a cero, se disparará hacia abajo en la parte inferior de su gráfica (infinitamente hacia abajo) porque cuando toma "log (acercándose a cero)", obtener "acercándose al infinito negativo".

symlog lo ayudaría en situaciones en las que desea tener un gráfico logarítmico, pero cuando el valor a veces puede descender hacia, o hacia, cero, pero aún desea poder mostrarlo en el gráfico de una manera significativa. Si necesita symlog, lo sabrá.

thomasrutter
fuente
Bueno ... leí eso, pero todavía no sé cuándo debería usar uno u otro. Esperaba algún tipo de ejemplo gráfico para poder ver cuál es el problema que Symlog intenta resolver.
Denilson Sá Maia
4

Aquí hay un ejemplo de comportamiento cuando es necesario un symlog:

Gráfico inicial, no escalado. Observe cuántos puntos se agrupan en x ~ 0

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

[ Sin escala '

Gráfico de escala logarítmica. Todo se derrumbó.

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

Escala logarítmica '

¿Por qué colapsó? Debido a que algunos valores en el eje x son muy cercanos o iguales a 0.

Gráfico escalado de Symlog. Todo es como debe ser.

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

Escala de Symlog

Gigikalo
fuente