Яка різниця між 'log' та 'symlog'?


101

У matplotlib я можу встановити масштаб осі за допомогою pyplot.xscale()або Axes.set_xscale(). Обидві функції приймають три різні шкали: 'linear'| 'log'| 'symlog'.

У чому різниця між 'log'і 'symlog'? У простому тесті, який я зробив, вони обидва виглядали абсолютно однаково.

Я знаю, що документація говорить, що вони приймають різні параметри, але я все ще не розумію різниці між ними. Може хтось, будь ласка, пояснить це? Відповідь буде найкращою, якщо в ній є якийсь зразок коду та графіки! (також: звідки походить назва "symlog"?)

Відповіді:


188

Нарешті я знайшов деякий час, щоб зробити кілька експериментів, щоб зрозуміти різницю між ними. Ось що я виявив:

  • logдозволяє лише позитивні значення та дозволяє вибрати, як поводитися з негативними ( maskабо clip).
  • symlogозначає симетричний журнал і допускає позитивні та негативні значення.
  • symlog дозволяє встановити діапазон навколо нуля в межах ділянки буде лінійним замість логарифмічним.

Я думаю, що все стане набагато простіше зрозуміти з графікою та прикладами, тому давайте спробуємо їх:

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

Графік, що використовує "лінійне" масштабування

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

Графік, що використовує 'log' масштабування та nonposx = 'маску'

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

Графік, що використовує 'log' масштабування та nonposx = 'кліп'

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

Графік, що використовує масштаб 'symlog'

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

Графік, що використовує масштаб 'symlog', але лінійний в межах (-20,20)

Для повноти я використовував наступний код для збереження кожної фігури:

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

Пам'ятайте, що ви можете змінити розмір фігури, використовуючи:

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

(Якщо ви не впевнені, що я відповідаю на моє запитання, прочитайте це )


19

symlog - це як журнал, але дозволяє визначити діапазон значень поблизу нуля, в межах якого графік лінійний, щоб уникнути того, щоб сюжет переходив до нескінченності навколо нуля.

Від http://matplotlib.sourceforge.net/api/axes_api.html#matplotlib.axes.Axes.set_xscale

У графіку журналу ви ніколи не можете мати нульове значення, і якщо у вас є значення, яке наближається до нуля, воно буде скочуватися вниз знизу вашого графіка (нескінченно вниз), тому що, коли ви берете "log (наближається до нуля)", ви отримати "наближення до негативної нескінченності".

symlog допоможе вам у ситуаціях, коли ви хочете мати графік журналу, але коли значення іноді може знижуватися до нуля, або до нуля, але ви все одно хочете вміти відображати це на графіку змістовно. Якщо вам потрібен symlog, ви знаєте.


Ну ... я це прочитав, але досі не знаю, коли мені слід використовувати те чи інше. Я очікував якогось графічного прикладу, щоб я міг реально побачити, яка проблема намагається вирішити Symlog .
Denilson Sá Maia

4

Ось приклад поведінки, коли потрібен симлог:

Початковий сюжет, не масштабований. Зауважте, скільки точок кластеризується при x ~ 0

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

[ Немасштабні '

Діаграма масштабування журналу. Все обвалилось.

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

Шкала журналу '

Чому він розвалився? Через те, що деякі осі на осі x дуже близькі або рівні 0.

Сюжет масштабованого масштабу. Все як належить.

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

Симлогічна шкала

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.