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

100

In matplotlib kann ich die Achsenskalierung entweder mit pyplot.xscale()oder einstellen Axes.set_xscale(). Beide Funktionen akzeptieren drei verschiedene Skalen: '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 besagt, dass sie unterschiedliche Parameter akzeptieren, aber ich verstehe den Unterschied zwischen ihnen immer noch nicht. Kann es bitte jemand erklären? Die Antwort ist die beste, wenn es einen Beispielcode und Grafiken gibt! (auch: woher kommt der Name 'symlog'?)

Denilson Sá Maia
quelle

Antworten:

188

Ich fand endlich Zeit, einige Experimente durchzuführen, um den Unterschied zwischen ihnen zu verstehen. Folgendes habe ich entdeckt:

  • logerlaubt nur positive Werte und lässt Sie wählen, wie mit negativen ( maskoder clip) umgegangen werden soll .
  • symlogbedeutet symmetrisches Protokoll und erlaubt positive und negative Werte.
  • symlog Ermöglicht das Festlegen eines Bereichs um Null innerhalb des Diagramms. Dies ist linear statt logarithmisch.

Ich denke, mit Grafiken und Beispielen wird alles viel einfacher zu verstehen sein. Probieren wir sie also aus:

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

Ein Diagramm mit 'linearer' Skalierung

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

Ein Diagramm mit 'log'-Skalierung und nonposx =' mask '

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

Ein Diagramm mit 'log'-Skalierung und nonposx =' clip '

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

Ein Diagramm mit Symlog-Skalierung

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

Ein Diagramm mit Symlog-Skalierung, jedoch linear innerhalb von (-20,20)

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 Figurengröße ändern können, indem Sie:

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

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

Denilson Sá Maia
quelle
19

symlog ist wie log, ermöglicht es Ihnen jedoch, einen Wertebereich nahe Null zu definieren, innerhalb dessen das Diagramm linear ist, um zu vermeiden, dass das Diagramm gegen Null unendlich wird.

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

In einem Protokolldiagramm können Sie niemals einen Nullwert haben, und wenn Sie einen Wert haben, der sich Null nähert, wird er weit unten in Ihrem Diagramm (unendlich nach unten) ansteigen, denn wenn Sie "log (gegen Null)" nehmen, werden Sie Holen Sie sich "Annäherung an die negative Unendlichkeit".

symlog hilft Ihnen in Situationen, in denen Sie ein Protokolldiagramm haben möchten, der Wert jedoch manchmal gegen oder gegen Null sinkt, Sie dies aber dennoch auf sinnvolle Weise im Diagramm anzeigen möchten. Wenn Sie Symlog benötigen, wissen Sie es.

thomasrutter
quelle
Nun ... ich habe das gelesen, aber ich weiß immer noch nicht, wann ich das eine oder andere verwenden soll. Ich hatte eine Art grafisches Beispiel erwartet, damit ich tatsächlich sehen konnte, welches Problem Symlog zu lösen versucht.
Denilson Sá Maia
4

Hier ist ein Beispiel für das Verhalten, wenn Symlog erforderlich ist:

Anfängliches Diagramm, nicht skaliert. Beachten Sie, wie viele Punkte sich bei x ~ 0 sammeln

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

[ Nicht skaliert '

Protokoll skaliertes Diagramm. Alles brach zusammen.

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

Logarithmische Darstellung '

Warum ist es zusammengebrochen? Da einige Werte auf der x-Achse sehr nahe oder gleich 0 sind.

Symlog-skalierter Plot. Alles ist so wie es sein sollte.

    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-Skala

Gigikalo
quelle