'Log' ve 'symlog' arasındaki fark nedir?


101

Gelen matplotlib , I kullanarak ekseni ölçekleme ayarlayabilir pyplot.xscale()veya Axes.set_xscale(). Her iki işlev de üç farklı ölçeği kabul eder: 'linear'| 'log'| 'symlog'.

Arasındaki fark nedir 'log've 'symlog'? Yaptığım basit bir testte ikisi de tamamen aynı görünüyordu.

Belgelerin farklı parametreleri kabul ettiklerini söylediğini biliyorum, ancak yine de aralarındaki farkı anlamıyorum. Lütfen birisi açıklayabilir mi? Bazı örnek kod ve grafiklere sahipse cevap en iyisi olacaktır! (ayrıca: 'symlog' adı nereden geliyor?)

Yanıtlar:


188

Sonunda aralarındaki farkı anlamak için bazı deneyler yapmak için biraz zaman buldum. İşte keşfettiğim şey:

  • logyalnızca pozitif değerlere izin verir ve negatif olanların ( maskveya clip) nasıl ele alınacağını seçmenize izin verir .
  • symlogsimetrik günlük anlamına gelir ve pozitif ve negatif değerlere izin verir.
  • symlog grafik içinde sıfır civarında bir aralık ayarlamaya izin verir, logaritmik yerine doğrusal olacaktır.

Grafikler ve örneklerle her şeyin daha kolay anlaşılacağını düşünüyorum, öyleyse deneyelim:

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

'Doğrusal' ölçeklendirme kullanan bir grafik

# 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' ölçeklendirme ve nonposx = 'mask' kullanan bir grafik

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

'Log' ölçeklendirme ve nonposx = 'clip' kullanan bir grafik

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

'Symlog' ölçeklendirmesini kullanan bir grafik

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

'Symlog' ölçeklendirmesini kullanan, ancak (-20,20) içinde doğrusal olan bir grafik

Tamlık adına, her bir rakamı kaydetmek için aşağıdaki kodu kullandım:

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

Şunları kullanarak şekil boyutunu değiştirebileceğinizi unutmayın:

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

(Bana kendi soruya cevap hakkında emin değilseniz, okumak bu )


19

symlog log , ancak grafiğin sıfır civarında sonsuza gitmesini önlemek için sıfıra yakın bir değer aralığı tanımlamanıza izin verir.

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

Bir günlük grafiğinde, hiçbir zaman sıfır değeriniz olamaz ve sıfıra yaklaşan bir değeriniz varsa, grafiğinizin dibinden aşağıya doğru yükselir (sonsuz olarak aşağı doğru) çünkü "günlük (sıfıra yaklaşan)" aldığınızda "negatif sonsuza yaklaşıyor" olsun.

symlog, bir günlük grafiğine sahip olmak istediğiniz durumlarda size yardımcı olur, ancak değer bazen sıfıra veya sıfıra düştüğünde, ancak yine de bunu grafikte anlamlı bir şekilde gösterebilmek istersiniz. Symlog'a ihtiyacınız varsa, bilirsiniz.


Şey ... Bunu okudum, ama hala birini veya diğerini ne zaman kullanmam gerektiğini bilmiyorum. Bir tür grafiksel örnek bekliyordum, böylece symlog'un çözmeye çalıştığı sorunun ne olduğunu gerçekten görebildim .
Denilson Sá Maia

4

İşte symlog gerekli olduğunda bir davranış örneği:

İlk arsa, ölçeklenmemiş. X ~ 0'da kaç nokta kümelendiğine dikkat edin

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

[Ölçeklenmemiş '

Ölçekli arsa günlüğü. Her şey çöktü.

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

Günlük ölçeği '

Neden çöktü? X eksenindeki bazı değerlerin 0'a çok yakın veya eşit olması nedeniyle.

Symlog ölçekli arsa. Her şey olması gerektiği gibi.

    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 ölçeği

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.