อะไรคือความแตกต่างระหว่าง 'log' และ 'symlog'?


103

ในmatplotlibฉันสามารถตั้งค่าการปรับขนาดแกนโดยใช้pyplot.xscale()หรือAxes.set_xscale(). ฟังก์ชันทั้งสองยอมรับสเกลที่แตกต่างกันสามแบบ: 'linear'| 'log'| 'symlog'.

อะไรคือความแตกต่างระหว่าง'log'และ'symlog'? ในการทดสอบง่ายๆที่ฉันทำทั้งสองดูเหมือนกันทุกประการ

ฉันรู้ว่าเอกสารระบุว่าพวกเขายอมรับพารามิเตอร์ที่แตกต่างกัน แต่ฉันยังไม่เข้าใจความแตกต่างระหว่างพารามิเตอร์เหล่านี้ ใครช่วยอธิบายหน่อยได้ไหม คำตอบจะดีที่สุดหากมีโค้ดตัวอย่างและกราฟิก! (ด้วย: ชื่อ 'symlog' มาจากไหน?)

คำตอบ:


189

ในที่สุดฉันก็พบว่ามีเวลาทำการทดลองบางอย่างเพื่อที่จะเข้าใจความแตกต่างระหว่างพวกเขา นี่คือสิ่งที่ฉันค้นพบ:

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

กราฟที่ใช้มาตราส่วน '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')

จำไว้ว่าคุณสามารถเปลี่ยนขนาดรูปได้โดยใช้:

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

(หากคุณไม่แน่ใจว่าฉันจะตอบคำถามของตัวเองโปรดอ่านสิ่งนี้ )


20

symlogเป็นเหมือนบันทึก แต่ให้คุณกำหนดช่วงของค่าใกล้ศูนย์ซึ่งพล็อตเป็นเชิงเส้นเพื่อหลีกเลี่ยงไม่ให้พล็อตไปที่อินฟินิตี้รอบศูนย์

จากhttp://matplotlib.sourceforge.net/api/axes_api.html#matplotlib.axes.Axes.set_xscale

ในกราฟบันทึกคุณจะไม่มีค่าเป็นศูนย์และหากคุณมีค่าที่เข้าใกล้ศูนย์ค่านั้นจะขัดขวางส่วนล่างสุดของกราฟ (ลงเรื่อย ๆ ) เพราะเมื่อคุณใช้ "บันทึก (เข้าใกล้ศูนย์)" คุณ "เข้าใกล้ค่าอนันต์เชิงลบ"

symlog จะช่วยคุณในสถานการณ์ที่คุณต้องการมีกราฟบันทึก แต่เมื่อบางครั้งค่าอาจลดลงไปทางหรือเป็นศูนย์ แต่คุณยังคงต้องการให้แสดงสิ่งนั้นบนกราฟอย่างมีความหมาย หากคุณต้องการ symlog คุณจะรู้


อืม ... ฉันอ่านแล้ว แต่ยังไม่รู้ว่าควรใช้เมื่อไหร่ดี ฉันคาดหวังว่าจะมีตัวอย่างกราฟิกบางประเภทดังนั้นฉันจึงสามารถดูได้ว่าปัญหาที่symlogพยายามแก้ไขคืออะไร
Denilson Sá Maia

5

นี่คือตัวอย่างพฤติกรรมเมื่อจำเป็นต้องใช้ 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.