В чем разница между 'log' и 'symlog'?


на matplotlib, Я могу установить масштабирование оси, используя либо pyplot.xscale() или Axes.set_xscale(). Обе функции принимают три различных масштаба:'linear'/'log'/'symlog'.

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

Я знаю, что в документации говорится, что они принимают разные параметры, но я все еще не понимаю разницы между ними. Мочь кто-нибудь, пожалуйста, объясните это? Ответ будет лучшим, если он имеет некоторый пример кода и графики! (также: откуда взялось название "symlog"?)

2 79

2 ответа:

я наконец-то нашла время, чтобы сделать некоторые эксперименты, чтобы понять разницу между ними. Вот что я обнаружил:

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

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)

просто для полноты, я использовал следующий код, чтобы сохранить каждый рисунок:

# 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.]

(если вы не уверены, что я отвечу на свой собственный вопрос, прочитайте этой)

symlog похоже на log, но позволяет определить диапазон значений около нуля, в котором участок линейный, чтобы избежать того, чтобы участок шел до бесконечности вокруг нуля.

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

в лог-графике вы никогда не можете иметь нулевое значение, и если у вас есть значение, которое приближается к нулю, оно будет Спайком вниз от дна вашего графика (бесконечно вниз) потому что когда вы берете "log(приближающийся к нулю)", вы получаете "приближающуюся отрицательную бесконечность".

symlog поможет вам в ситуациях, когда вы хотите иметь график журнала, но когда значение может иногда снижаться до нуля или до нуля, но вы все равно хотите показать это на графике значимым образом. Если вам нужен symlog, вы бы знали.