2010-07-22 4 views
69

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

В чем разница между 'log' и 'symlog'? В простом тесте я сделал то же самое.

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

ответ

124

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

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

(Если вы не знаете обо мне, отвечая на мой собственный вопрос, прочитал this)

14

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

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

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

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

+0

Ну ... Я читал, но я до сих пор не знаю, когда я должен использовать один или другой. Я ожидал какой-то графический пример, поэтому я мог бы фактически увидеть **, в чем проблема, которую * symlog * пытается решить. –

 Смежные вопросы

  • Нет связанных вопросов^_^