Qual é a diferença entre 'log' e 'symlog'?

101

Em matplotlib , posso definir a escala do eixo usando pyplot.xscale()ou Axes.set_xscale(). Ambas as funções aceitam três escalas diferentes: 'linear'| 'log'| 'symlog'.

Qual é a diferença entre 'log'e 'symlog'? Em um teste simples que fiz, ambos pareciam exatamente iguais.

Eu sei que a documentação diz que eles aceitam parâmetros diferentes, mas ainda não entendo a diferença entre eles. Alguém pode explicar isso? A resposta será a melhor se tiver algum código de amostra e gráficos! (também: de onde vem o nome 'symlog'?)

Denilson Sá Maia
fonte

Respostas:

188

Finalmente encontrei algum tempo para fazer alguns experimentos a fim de entender a diferença entre eles. Aqui está o que descobri:

  • logpermite apenas valores positivos e permite escolher como lidar com os negativos ( maskou clip).
  • symlogsignifica log simétrico e permite valores positivos e negativos.
  • symlog permite definir um intervalo em torno de zero dentro do gráfico será linear em vez de logarítmico.

Acho que tudo ficará muito mais fácil de entender com gráficos e exemplos, então vamos experimentá-los:

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

Um gráfico usando escala 'linear'

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

Um gráfico usando escala 'log' e não posx = 'máscara'

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

Um gráfico usando escala 'log' e não posx = 'clipe'

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

Um gráfico usando escala 'symlog'

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

Um gráfico usando escala 'symlog', mas linear dentro (-20,20)

Apenas para completar, usei o seguinte código para salvar cada figura:

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

Lembre-se de que você pode alterar o tamanho da figura usando:

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

(Se você não tem certeza sobre como responder à minha própria pergunta, leia isto )

Denilson Sá Maia
fonte
19

symlog é como log, mas permite que você defina uma faixa de valores próximos de zero dentro do qual o gráfico é linear, para evitar que o gráfico vá para o infinito em torno de zero.

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

Em um gráfico de log, você nunca pode ter um valor zero, e se você tiver um valor que se aproxima de zero, ele irá disparar para baixo do seu gráfico (infinitamente para baixo) porque quando você pega "log (se aproximando de zero)", você obter "se aproximando do infinito negativo".

symlog o ajudaria em situações em que você deseja ter um gráfico de log, mas quando o valor pode às vezes cair para, ou para, zero, mas você ainda deseja ser capaz de mostrar isso no gráfico de uma forma significativa. Se você precisa do symlog, você sabe.

Thomasrutter
fonte
Bem ... eu li isso, mas ainda não sei quando devo usar um ou outro. Eu estava esperando algum tipo de exemplo gráfico para que eu pudesse realmente ver qual é o problema que o symlog tenta resolver.
Denilson Sá Maia
4

Aqui está um exemplo de comportamento quando o symlog é necessário:

Gráfico inicial, não escalado. Observe quantos pontos se aglomeram em x ~ 0

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

[ Sem escala '

Gráfico em escala de log. Tudo desabou.

    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 que desabou? Por causa de alguns valores no eixo x serem muito próximos ou iguais a 0.

Gráfico em escala Symlog. Tudo está como deveria 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 Symlog

Gigikalo
fonte