簡體   English   中英

線性X對數刻度

[英]Linear X Logarithmic scale

給定X像素長的行像:

 0-------|---V---|-------|-------|-------max 

如果0 <= V <= max ,則在線性標度V位置將是X/max*V像素。

如何計算對數刻度的像素位置,並從像素位置開始如何取回V的值?

  1. 這不是功課
  2. 我想知道數學(請不要“使用FOO-plotlib”評論)
  3. 我喜歡Python

對數刻度具有“縮放”刻度左側的效果。 相反,是否有可能為右側做同樣的事情?

[UPDATE]

謝謝你的數學課!

我最終沒有使用對數。 我只是使用平均值(在一組值中)作為比例的中心。 此控件用於為將用於繪制等值線圖的一組值選擇組邊界百分位數。

如果用戶選擇對稱刻度(紅色標記=平均值,綠色標記=中心,黑暗表示值的出現次數): 在此輸入圖像描述

不對稱比例使細粒度調整更容易: 在此輸入圖像描述

所以你有一些任意值V ,你知道0 <= V <= Vmax 您想要計算像素的x坐標,將其稱為X ,其中“屏幕”具有從0到Xmax x坐標。 正如你所說,要做到這一點是“正常”的方式,你就行了

X = Xmax * V / Vmax
V = Vmax * X / Xmax

我喜歡把它想象成我首先通過計算V / Vmax將值歸一化到介於0和1之間,然后我將該值乘以最大值得到介於0和最大值之間的值。

要以對數方式執行相同的操作,您需要V值的不同下限。 如果V <= 0,則會得到ValueError 所以假設0 < Vmin <= V <= Vmax 然后你需要找出使用什么對數,因為它們中有很多。 通常遇到三個,那些有基數2,e和10,這導致x軸看起來像這樣:

------|------|------|------|----      ------|------|------|------|----
    2^-1    2^0    2^1    2^2     ==       0.5     1      2      4

------|------|------|------|----      ------|------|------|------|----
    e^-1    e^0    e^1    e^2     ==       0.4     1     2.7    7.4

------|------|------|------|----      ------|------|------|------|----
    10^-1  10^0   10^1   10^2     ==       0.1     1     10     100

所以原則上,如果我們可以從左邊的表達式得到指數,我們可以使用與上面相同的原理來獲得0到Xmax之間的Xmax ,這當然是log進來的地方。假設你使用base b ,您可以使用這些表達式來回轉換:

from math import log
logmax = log(Vmax / Vmin, b)
X = Xmax * log(V / Vmin, b) / logmax
V = Vmin * b ** (logmax * X / Xmax)

這幾乎是相同的思維方式,除了你需要首先確保log(somevalue, b)會給你一個非負值。 您可以通過在log函數中除以Vmin完成此操作。 現在你可以除以表達式可以產生的最大值,當然這是log(Vmax / Vmin, b) ,你將獲得一個介於0和1之間的值,與之前相同。

另一種方式我們需要首先標准化( X / Xmax ),然后再次放大( * logmax )到逆函數預期的最大值。 順便提一下,將b提高到某個值。 現在,如果X為0,則b ** (logmax * X / Xmax)將等於1,因此為了得到正確的下限,我們乘以Vmin 換句話說,因為我們以另一種方式做的第一件事是除以Vmin ,我們需要乘以Vmin作為我們現在做的最后一件事。

要“縮放”方程式的“右側”,您需要做的就是切換方程式,這樣您就可以從VX進行取冪,並以對數的方式進行另一種方式。 原則上,就是這樣。 因為你還必須做一些X可以為0的事情:

logmax = log(Xmax + 1, b)
X = b ** (logmax * (V - Vmin) / (Vmax - Vmin)) - 1
V = (Vmax - Vmin) * log(X + 1, b) / logmax + Vmin
           Linear               Logarithmic
Forward    pos = V * X/max      pos = log(V) * X/log(max)
Reverse    V = pos * max/X      V = B^( pos * log(max)/X )

(B是對數的基數)

顯然,您必須確保V> = 1(V = 1將對應於pos = 0,V = 0..1對應於-inf..0,並且對於V <0對數未定義)。

這可以很容易地擴展到其他功能。 我的空間度量是以字符而不是像素給出的(這就是為什么max == chars(或像素))。
僅適用於正值。

import math

def scale(myval, mode='lin'):
    steps = 7
    chars = max = 10 * steps

    if mode=='log':
        val = 10 * math.log10(myval)
    else:
        val = myval

    coord = []
    count = 0
    not_yet = True
    for i in range(steps):
        for j in range(10):
            count += 1
            if val <= count and not_yet:
                coord.append('V')
                not_yet = False
                pos = count
            elif j==9:
                coord.append('|')
            else:
                coord.append('*')

    graph = ''.join(coord)
    text = 'graph %s\n\n%s\nvalue = %5.1f   rel.pos. = %5.2f\n'
    print  text % (mode, graph, myval, chars * pos/max) 


scale(50, 'lin')
scale(50, 'log')

在此輸入圖像描述

希望以上不被認為是FOO-plotlib。 該死的! 這是啊! :-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM