[python] ‘log’와 ‘symlog’의 차이점은 무엇입니까?

에서 하기 matplotlib , 나도 사용하여 축 스케일링을 설정할 수 있습니다 pyplot.xscale()또는 Axes.set_xscale(). 두 함수 모두 세 가지 다른 스케일을 허용합니다. 'linear'| 'log'| 'symlog'.

'log'과 의 차이점은 무엇입니까 'symlog'? 내가 한 간단한 테스트에서 둘 다 똑같이 보였습니다.

문서에 서로 다른 매개 변수를 허용한다고 나와 있지만 여전히 그 차이를 이해하지 못합니다. 누군가 그것을 설명해 주시겠습니까? 샘플 코드와 그래픽이 있으면 대답이 가장 좋습니다! (동의어 : ‘symlog’라는 이름은 어디에서 왔습니까?)



답변

나는 마침내 그들 사이의 차이점을 이해하기 위해 몇 가지 실험을 할 시간을 찾았습니다. 내가 발견 한 내용은 다음과 같습니다.

  • log양수 값만 허용하고 음수 값 ( mask또는 clip) 을 처리하는 방법을 선택할 수 있습니다 .
  • symlog대칭 로그를 의미하며 양수 및 음수 값을 허용합니다.
  • symlog 플롯 내에서 0 주변의 범위를 설정할 수 있습니다.

그래픽과 예제를 통해 모든 것이 훨씬 더 이해하기 쉬워 질 것이라고 생각하므로 시도해 봅시다.

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 = 'mask'를 사용하는 그래프

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

'log'스케일링과 nonposx = 'clip'을 사용하는 그래프

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

다음을 사용하여 Figure 크기를 변경할 수 있습니다.

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

(내 질문에 대한 답이 확실하지 않다면 이것을 읽으십시오 )


답변

symlog 는 로그와 비슷하지만 플롯이 선형 인 0에 가까운 값의 범위를 정의하여 플롯이 0 부근에서 무한대로 이동하지 않도록 할 수 있습니다.

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

로그 그래프에서는 0 값을 가질 수 없으며, 0에 접근하는 값이있는 경우 “log (approaching zero)”를 취하면 그래프의 맨 아래에서 (무한히 아래로) 스파이크가 발생합니다. “음의 무한대에 접근”합니다.

symlog는 로그 그래프를 원하지만 값이 때때로 0으로 내려가거나 0으로 내려갈 수 있지만 그래도 의미있는 방식으로 그래프에 표시 할 수있는 상황에서 도움이됩니다. symlog가 필요하면 알 것입니다.


답변

다음은 symlog가 필요한 경우 동작의 예입니다.

스케일링되지 않은 초기 플롯. 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에 매우 가깝거나 같기 때문입니다.

Symlog 스케일 플롯. 모든 것이 있어야합니다.

    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 스케일


답변