Pertanyaan Apa perbedaan antara 'log' dan 'symlog'?


Di matplotlib, Saya bisa mengatur skala sumbu menggunakan salah satunya pyplot.xscale() atau Axes.set_xscale(). Kedua fungsi menerima tiga skala berbeda: 'linear' | 'log' | 'symlog'.

Apa perbedaan antara 'log' dan 'symlog'? Dalam tes sederhana yang saya lakukan, mereka berdua tampak persis sama.

Saya tahu dokumentasi 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 contoh kode dan grafik! (juga: dari mana nama 'symlog' berasal?)


75
2017-07-22 04:55


asal


Jawaban:


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

  • log hanya memungkinkan nilai positif, dan memungkinkan Anda memilih cara menangani yang negatif (mask atau clip).
  • symlog cara log simetris, dan memungkinkan nilai positif dan negatif.
  • symlog memungkinkan untuk mengatur rentang sekitar nol dalam plot akan linear, bukan logaritmik.

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

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

A graph using 'linear' scaling

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

A graph using 'log' scaling and nonposx='mask'

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

A graph using 'log' scaling and nonposx='clip'

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

A graph using 'symlog' scaling

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

A graph using 'symlog' scaling, but linear within (-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, bacalah ini)


139
2017-08-18 14:29



symlog seperti log tetapi memungkinkan Anda untuk menentukan rentang nilai mendekati nol di mana plot adalah linear, untuk menghindari plot pergi ke infinity sekitar nol.

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

Dalam grafik log, Anda tidak pernah dapat memiliki nilai nol, dan jika Anda memiliki nilai yang mendekati nol, itu akan melonjak turun dari bawah grafik Anda (jauh ke bawah) karena ketika Anda mengambil "log (mendekati nol)" Anda dapatkan "mendekati infinity negatif".

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


16
2017-07-22 04:58