В чем разница между 'log' и 'symlog'?
на matplotlib, Я могу установить масштабирование оси, используя либо pyplot.xscale()
или Axes.set_xscale()
. Обе функции принимают три различных масштаба:'linear'
/'log'
/'symlog'
.
в чем разница между 'log'
и 'symlog'
? В простом тесте, который я сделал, они оба выглядели точно так же.
Я знаю, что в документации говорится, что они принимают разные параметры, но я все еще не понимаю разницы между ними. Мочь кто-нибудь, пожалуйста, объясните это? Ответ будет лучшим, если он имеет некоторый пример кода и графики! (также: откуда взялось название "symlog"?)
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')
# 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')
# 'clip' will map all negative values a very small positive one pyplot.xscale('log', nonposx='clip')
# 'symlog' scaling, however, handles negative values nicely pyplot.xscale('symlog')
# And you can even set a linear range around zero pyplot.xscale('symlog', linthreshx=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, вы бы знали.