Apa perbedaan antara 'log' dan 'symlog'?

101

Di matplotlib , saya dapat mengatur skala sumbu menggunakan pyplot.xscale()atau Axes.set_xscale(). Kedua fungsi tersebut menerima tiga skala yang berbeda: 'linear'| 'log'| 'symlog'.

Apa perbedaan antara 'log'dan 'symlog'? Dalam tes sederhana yang saya lakukan, keduanya terlihat persis sama.

Saya tahu dokumentasinya mengatakan mereka menerima parameter yang berbeda, tetapi saya masih tidak mengerti perbedaan di antara mereka. Bisakah seseorang menjelaskannya? Jawabannya akan menjadi yang terbaik jika memiliki beberapa kode sampel dan gambar! (juga: dari mana asal nama 'symlog'?)

Denilson Sá Maia
sumber

Jawaban:

188

Saya akhirnya menemukan beberapa waktu untuk melakukan beberapa eksperimen untuk memahami perbedaan di antara mereka. Inilah yang saya temukan:

  • loghanya mengizinkan nilai positif, dan memungkinkan Anda memilih cara menangani nilai negatif ( maskatau clip).
  • symlogberarti log simetris , dan memungkinkan nilai positif dan negatif.
  • symlog memungkinkan untuk mengatur kisaran sekitar nol dalam plot akan linier, bukan logaritmik.

Saya pikir semuanya akan jauh lebih mudah dipahami dengan grafik dan contoh, jadi mari kita coba:

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

Grafik menggunakan penskalaan 'linier'

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

Grafik menggunakan skala 'log' dan nonposx = 'mask'

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

Grafik menggunakan skala 'log' dan nonposx = 'clip'

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

Grafik menggunakan skala 'symlog'

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

Grafik menggunakan skala 'symlog', tetapi linier dalam (-20,20)

Hanya untuk kelengkapan, saya telah menggunakan kode berikut untuk menyimpan setiap gambar:

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

Ingat Anda dapat mengubah ukuran gambar menggunakan:

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

(Jika Anda tidak yakin tentang saya menjawab pertanyaan saya sendiri, baca ini )

Denilson Sá Maia
sumber
19

symlog seperti log tetapi memungkinkan Anda untuk menentukan kisaran nilai mendekati nol di mana plotnya linier, untuk menghindari plot menjadi tak terhingga sekitar nol.

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

Dalam grafik log, Anda tidak akan pernah memiliki nilai nol, dan jika Anda memiliki nilai yang mendekati nol, nilai itu akan melonjak turun dari bawah grafik Anda (ke bawah tanpa batas) karena ketika Anda mengambil "log (mendekati nol)" Anda mendapatkan "mendekati tak terhingga negatif".

symlog akan membantu Anda dalam situasi di mana Anda ingin memiliki grafik log, tetapi ketika nilainya kadang-kadang turun menuju, atau ke, nol, tetapi Anda masih ingin dapat menunjukkannya pada grafik dengan cara yang berarti. Jika Anda membutuhkan symlog, Anda pasti tahu.

thomasrutter
sumber
Yah ... Saya membaca itu, tapi saya masih tidak tahu kapan saya harus menggunakan satu atau yang lain. Saya mengharapkan semacam contoh grafis sehingga saya benar-benar dapat melihat masalah apa yang coba dipecahkan oleh symlog .
Denilson Sá Maia
4

Berikut adalah contoh perilaku ketika symlog diperlukan:

Plot awal, tidak diskalakan. Perhatikan berapa banyak titik yang mengelompok pada x ~ 0

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

[ Tidak berskala '

Plot berskala log. Semuanya runtuh.

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

Skala log '

Mengapa itu runtuh? Karena beberapa nilai pada sumbu x sangat dekat atau sama dengan 0.

Plot berskala Symlog. Semuanya sebagaimana mestinya.

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

Skala Symlog

Gigikalo
sumber