2010-07-22 24 views
69

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

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

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 expliquer s'il vous plaît? La réponse sera la meilleure si elle a un échantillon de code et de graphiques! (Aussi: d'où vient le nom de « SYMLOG » viennent)

Répondre

124

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

  • ne permet log des valeurs positives, et vous permet de choisir comment gérer les effets négatifs (mask ou clip).
  • symlog signifie log symétrique, et permet des 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 ira beaucoup plus facile à comprendre avec des graphiques et des exemples, donc nous allons les essayer:

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, je l'ai utilisé le code suivant pour enregistrer chaque chiffre:

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

Rappelez-vous que vous pouvez changer 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 de me répondre à ma propre question, lisez this)

14

SYMLOG est comme journal, mais vous permet de définir une plage de valeurs proches de zéro dans lequel l'intrigue est linéaire, pour éviter d'avoir l'intrigue aller à l'infini autour de zéro.

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

Dans un graphique du journal, on ne peut jamais avoir une valeur nulle, et si vous avez une valeur qui se rapproche de zéro, il sera pic vers le bas chemin du fond de votre graphique (à l'infini vers le bas) parce que quand vous prenez "log (approche zéro)" vous obtenez "approche infini négatif". Symlog vous aiderait dans les situations où vous voulez avoir un graphique de log, mais quand la valeur peut parfois descendre vers, ou à, zéro, mais vous voulez toujours être capable de montrer cela sur le graphique dans un manière significative. Si vous avez besoin de symlog, vous le savez.

+0

Eh bien ... Je l'ai lu, mais je ne sais toujours pas quand je devrais utiliser un ou l'autre. J'attendais une sorte d'exemple graphique pour que je puisse réellement ** voir ** quel est le problème que * symlog * essaie de résoudre. –