Frage Was ist der Unterschied zwischen 'log' und 'symlog'?


Im Matplotlib, Kann ich die Achsenskalierung mit beiden einstellen pyplot.xscale() oder Axes.set_xscale(). Beide Funktionen akzeptieren drei verschiedene Maßstäbe: 'linear' | 'log' | 'symlog'.

Was ist der Unterschied zwischen 'log' und 'symlog'? In einem einfachen Test, den ich gemacht habe, sahen beide genau gleich aus.

Ich weiß, dass die Dokumentation sagt, dass sie verschiedene Parameter akzeptieren, aber ich verstehe immer noch nicht den Unterschied zwischen ihnen. Kann mir bitte jemand das erklären? Die Antwort wird die beste sein, wenn es einige Beispielcode und Grafiken hat! (auch: woher kommt der Name 'symlog'?)


75
2017-07-22 04:55


Ursprung


Antworten:


Ich habe endlich Zeit gefunden, ein paar Experimente zu machen, um den Unterschied zwischen ihnen zu verstehen. Folgendes habe ich entdeckt:

  • log erlaubt nur positive Werte und lässt Sie wählen, wie mit negativen umzugehen ist (mask oder clip).
  • symlog meint symmetrisches Protokollund erlaubt positive und negative Werte.
  • symlog erlaubt, einen Bereich um Null innerhalb des Diagramms zu setzen wird linear statt logarithmisch sein.

Ich denke, alles wird mit Grafiken und Beispielen viel einfacher zu verstehen sein, also lasst es uns versuchen:

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)

Nur der Vollständigkeit halber habe ich den folgenden Code verwendet, um jede Figur zu speichern:

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

Denken Sie daran, dass Sie die Größe der Figur ändern können mit:

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

(Wenn Sie nicht sicher sind, ob ich meine eigene Frage beantworte, lesen Sie Dies)


139
2017-08-18 14:29



Symlog ist wie log, erlaubt es aber, einen Bereich von Werten nahe Null zu definieren, innerhalb dessen die Darstellung linear ist, um zu vermeiden, dass die Darstellung gegen Null geht.

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

In einem Log-Diagramm können Sie niemals einen Wert von Null haben, und wenn Sie einen Wert haben, der gegen Null geht, wird er vom unteren Ende Ihres Graphen (unendlich nach unten) abstürzen, denn wenn Sie "log (Annäherung an Null)" nehmen "Annäherung an negative Unendlichkeit".

symlog würde Ihnen in Situationen helfen, in denen Sie ein Log-Diagramm haben möchten, aber wenn der Wert manchmal in Richtung Null oder Null sinkt, aber Sie möchten das in der Grafik sinnvoll darstellen können. Wenn Sie Symlog brauchen, würden Sie es wissen.


16
2017-07-22 04:58