Sự khác biệt giữa 'log' và 'symlog' là gì?


101

Trong matplotlib , tôi có thể đặt tỷ lệ trục bằng cách sử dụng pyplot.xscale()hoặc Axes.set_xscale(). Cả hai hàm đều chấp nhận ba thang đo khác nhau: 'linear'| 'log'| 'symlog'.

Sự khác biệt giữa 'log'và là 'symlog'gì? Trong một bài kiểm tra đơn giản mà tôi đã làm, cả hai đều trông giống hệt nhau.

Tôi biết tài liệu nói rằng họ chấp nhận các tham số khác nhau, nhưng tôi vẫn không hiểu sự khác biệt giữa chúng. Ai đó có thể vui lòng giải thích nó? Câu trả lời sẽ là tốt nhất nếu nó có một số mã mẫu và đồ họa! (còn: tên 'symlog' đến từ đâu?)

Câu trả lời:


188

Cuối cùng tôi đã tìm được thời gian để làm một số thí nghiệm để hiểu sự khác biệt giữa chúng. Đây là những gì tôi đã khám phá ra:

  • logchỉ cho phép các giá trị dương và cho phép bạn chọn cách xử lý ( maskhoặc clip) các giá trị âm .
  • symlognghĩa là log đối xứng , và cho phép các giá trị âm và dương.
  • symlog cho phép thiết lập một phạm vi xung quanh 0 trong biểu đồ sẽ là tuyến tính thay vì lôgarit.

Tôi nghĩ mọi thứ sẽ dễ hiểu hơn rất nhiều với đồ họa và ví dụ, vì vậy hãy thử chúng:

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

Biểu đồ sử dụng tỷ lệ 'tuyến tính'

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

Biểu đồ sử dụng chia tỷ lệ 'log' và nonposx = 'mask'

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

Biểu đồ sử dụng chia tỷ lệ 'log' và nonposx = 'clip'

# 'symlog' scaling, however, handles negative values nicely
pyplot.xscale('symlog')

Biểu đồ sử dụng tỷ lệ 'symlog'

# And you can even set a linear range around zero
pyplot.xscale('symlog', linthreshx=20)

Biểu đồ sử dụng tỷ lệ 'symlog', nhưng tuyến tính trong (-20,20)

Chỉ để hoàn thiện, tôi đã sử dụng đoạn mã sau để lưu từng hình:

# Default dpi is 80
pyplot.savefig('matplotlib_xscale_linear.png', dpi=50, bbox_inches='tight')

Hãy nhớ rằng bạn có thể thay đổi kích thước hình bằng cách sử dụng:

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

(Nếu bạn không chắc về việc tôi trả lời câu hỏi của chính mình, hãy đọc phần này )


19

symlog giống như log nhưng cho phép bạn xác định một phạm vi giá trị gần 0 mà trong đó biểu đồ là tuyến tính, để tránh việc biểu đồ đi đến vô cùng xung quanh 0.

Từ http://matplotlib.sourceforge.net/api/axes_api.html#matplotlib.axes.Axes.set_xscale

Trong biểu đồ nhật ký, bạn không bao giờ có thể có giá trị bằng 0 và nếu bạn có giá trị gần bằng 0, giá trị đó sẽ tăng đột biến từ dưới lên khỏi biểu đồ của bạn (vô hạn xuống) bởi vì khi bạn lấy "nhật ký (gần bằng không)" bạn nhận được "tiệm cận âm vô cùng".

symlog sẽ giúp bạn trong những trường hợp bạn muốn có một đồ thị nhật ký, nhưng khi giá trị đôi khi có thể giảm xuống hoặc bằng 0, nhưng bạn vẫn muốn thể hiện điều đó trên đồ thị một cách có ý nghĩa. Nếu bạn cần symlog, bạn sẽ biết.


Chà ... Tôi đã đọc điều đó, nhưng tôi vẫn không biết khi nào mình nên sử dụng cái này hay cái khác. Tôi đã mong đợi một số loại ví dụ đồ họa để tôi thực sự có thể thấy vấn đề mà symlog cố gắng giải quyết.
Denilson Sá Maia

4

Đây là một ví dụ về hành vi khi symlog là cần thiết:

Cốt truyện ban đầu, không được chia tỷ lệ. Chú ý có bao nhiêu chấm cụm tại x ~ 0

    ax = sns.scatterplot(x= 'Score', y ='Total Amount Deposited', data = df, hue = 'Predicted Category')

[ Không chia tỷ lệ '

Nhật ký tỷ lệ cốt truyện. Mọi thứ sụp đổ.

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

Đăng nhập quy mô '

Tại sao nó lại sụp đổ? Vì một số giá trị trên trục x rất gần hoặc bằng 0.

Âm mưu tỷ lệ Symlog. Mọi thứ đều như nó phải như vậy.

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

Quy mô nhật ký đồng bộ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.