114 votes

Quelle est la différence entre 'log' et 'symlog' ?

Sur matplotlib je peux définir la mise à l'échelle de l'axe en utilisant l'une ou l'autre des méthodes suivantes pyplot.xscale() ou Axes.set_xscale() . Ces deux fonctions acceptent trois échelles différentes : 'linear' | 'log' | 'symlog' .

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

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

203voto

Denilson Sá Points 6953

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

  • log n'autorise que les valeurs positives, et vous laisse choisir comment traiter les valeurs négatives ( mask ou clip ).
  • symlog signifie bûche symétrique et autorise les valeurs positives et négatives.
  • symlog permet de définir une plage autour de zéro dans laquelle le tracé sera linéaire au lieu d'être logarithmique.

Je pense que tout sera 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')

A graph using 'linear' scaling

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

A graph using 'log' scaling and nonposx='mask'

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

A graph using 'log' scaling and nonposx='clip'

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

A graph using 'symlog' scaling

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

A graph using 'symlog' scaling, but linear within (-20,20)

Juste pour être complet, j'ai utilisé le code suivant pour sauvegarder 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 certain que je réponde à ma propre question, lisez ce )

21voto

thomasrutter Points 42905

symlogue est similaire à log mais vous permet de définir une plage de valeurs proches de zéro dans laquelle le tracé est linéaire, afin d'éviter que le tracé ne s'étende à l'infini autour de zéro.

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

Dans un graphique logarithmique, vous ne pouvez jamais avoir une valeur nulle, et si vous avez une valeur qui s'approche de zéro, elle va descendre en flèche jusqu'au bas de votre graphique (infiniment vers le bas) parce que lorsque vous prenez "log(approchant zéro)", vous obtenez "approchant l'infini négatif".

symlog vous aiderait dans les situations où vous voulez avoir un graphique logarithmique, mais où la valeur peut parfois descendre vers, ou jusqu'à, zéro, mais où vous voulez toujours être capable de montrer cela sur le graphique d'une manière significative. Si vous avez besoin de symlog, vous le saurez.

0 votes

Eh bien... J'ai lu ça, mais je ne sais toujours pas quand je dois utiliser l'un ou l'autre. Je m'attendais à une sorte d'exemple graphique pour pouvoir réellement voir quel est le problème que symlogue tente de résoudre.

6voto

Gigikalo Points 131

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

Tracé à l'échelle logarithmique. 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')

Log scale '

Pourquoi s'est-elle effondrée ? Parce que certaines valeurs sur l'axe des x sont très proches ou égales à 0.

Tracé à l'échelle de 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')

Symlog scale

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X