[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')
# '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')
다음을 사용하여 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')