Quelle est la différence entre «log» et «symlog»?


101

Dans matplotlib , je peux définir la mise à l'échelle de l'axe en utilisant soit pyplot.xscale()ou Axes.set_xscale(). Les deux fonctions acceptent trois échelles différentes: 'linear'| 'log'| 'symlog'.

Quelle est la différence entre 'log'et 'symlog'? Dans un test simple que j'ai fait, ils avaient tous les deux exactement la même apparence.

Je sais que la documentation dit qu'ils acceptent différents paramètres, mais je ne comprends toujours pas la différence entre eux. Quelqu'un peut-il l'expliquer? La réponse sera la meilleure si elle contient des exemples de code et de graphiques! (aussi: d'où vient le nom 'symlog'?)

Réponses:


188

J'ai finalement trouvé le temps de faire quelques expériences afin de comprendre la différence entre elles. Voici ce que j'ai découvert:

  • logn'autorise que les valeurs positives et vous permet de choisir comment gérer les valeurs négatives ( maskou clip).
  • symlogsignifie log symétrique et autorise des valeurs positives et négatives.
  • symlog permet de définir une plage autour de zéro dans le graphique sera linéaire au lieu de logarithmique.

Je pense que tout deviendra beaucoup plus facile à comprendre avec des graphiques et des exemples, alors essayons-les:

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 graphe utilisant une mise à l'échelle `` linéaire ''

# 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 graphique utilisant la mise à l'échelle 'log' et nonposx = 'mask'

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

Un graphique utilisant la mise à l'échelle 'log' et nonposx = 'clip'

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

Un graphe utilisant la mise à l'échelle 'symlog'

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

Un graphique utilisant la mise à l'échelle 'symlog', mais linéaire à l'intérieur (-20,20)

Juste pour être complet, j'ai utilisé le code suivant pour enregistrer chaque figure:

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

N'oubliez pas que vous pouvez modifier la taille de la figure en utilisant:

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

(Si vous n'êtes pas sûr que je réponde à ma propre question, lisez ceci )


19

symlog est comme log mais vous permet de définir une plage de valeurs proche de zéro dans laquelle le tracé est linéaire, pour éviter que le tracé ne passe à l'infini autour de zéro.

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

Dans un graphique de journal, vous ne pouvez jamais avoir une valeur nulle, et si vous avez une valeur qui s'approche de zéro, elle augmentera en bas de votre graphique (infiniment vers le bas) parce que lorsque vous prenez "log (approche de zéro)" vous obtenir "approchant l'infini négatif".

symlog vous aiderait dans les situations où vous voulez avoir un graphique de journal, mais lorsque la valeur peut parfois descendre vers, ou vers, zéro, mais que vous voulez toujours pouvoir montrer cela sur le graphique de manière significative. Si vous avez besoin de symlog, vous le saurez.


Eh bien ... j'ai lu ça, mais je ne sais toujours pas quand je devrais utiliser l'un ou l'autre. Je m'attendais à une sorte d'exemple graphique pour que je puisse réellement voir quel est le problème que symlog essaie de résoudre.
Denilson Sá Maia

4

Voici un exemple de comportement lorsque symlog est nécessaire:

Tracé initial, non mis à l'échelle. Remarquez combien de points se regroupent à x ~ 0

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

[ Non mis à l'échelle '

Graphique à l'échelle du journal. Tout s'est effondré.

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

Échelle logarithmique '

Pourquoi s'est-il effondré? En raison de certaines valeurs sur l'axe des x étant très proches ou égales à 0.

Tracé à l'échelle Symlog. Tout est comme il se doit.

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

Échelle Symlog

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.