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

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 prueba simple que hice, ambas parecían exactamente iguales.

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

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

  • log solo permite valores positivos y le permite elegir cómo manejar los negativos ( mask o clip ).
  • symlog significa registro simétrico y permite valores positivos y negativos.
  • symlog permite establecer un rango alrededor de cero dentro de la ttwig que 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') 

Una gráfica usando 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 la escala 'log' y nonposx = 'mask'

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

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

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

Una gráfica que usa escala 'symlog'

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

Un gráfico que utiliza la escala '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 yo responda mi propia pregunta, lea esto )

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

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

En un gráfico de registro, nunca puede tener un valor cero, y si tiene un valor que se aproxima a cero, descenderá de la parte inferior de su gráfico (infinitamente hacia abajo) porque cuando toma el “registro (acercándose a cero)” obtener “acercándose al infinito negativo”.

symlog lo ayudaría en situaciones en las que desea tener un gráfico de registro, pero cuando el valor a veces puede bajar a cero o a cero, pero aún así desea poder mostrar eso en el gráfico de manera significativa. Si necesitas symlog, lo sabrías.