web-dev-qa-db-fra.com

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

Dans matplotlib , je peux définir la mise à l'échelle de l'axe en utilisant 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 se ressemblaient tous les deux.

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

86
Denilson Sá Maia

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:

  • log n'autorise que les valeurs positives et vous permet de choisir comment gérer les valeurs négatives (mask ou clip).
  • symlog signifie log symétrique , et autorise les valeurs positives et négatives.
  • symlog permet de définir une plage autour de zéro dans le tracé sera linéaire au lieu de 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 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 )

163
Denilson Sá Maia

symlog est comme log mais vous permet de définir une plage de valeurs proche de zéro à l'intérieur de laquelle le tracé est linéaire, pour éviter que le tracé 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 se rapproche de zéro, elle grimpera en bas du 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 souhaitez avoir un graphique de journal, mais quand la valeur peut parfois descendre vers ou vers zéro, mais vous voulez toujours pouvoir le montrer sur le graphique de manière significative. Si vous avez besoin de symlog, vous le saurez.

18
thomasrutter