![](/img/trans.png)
[英]how to show an interval in logarithmic scale and other linear in matplotlib
[英]Linear X Logarithmic scale
給定X
像素長的行像:
0-------|---V---|-------|-------|-------max
如果0 <= V <= max
,則在線性標度V
位置將是X/max*V
像素。
如何計算對數刻度的像素位置,並從像素位置開始如何取回V的值?
對數刻度具有“縮放”刻度左側的效果。 相反,是否有可能為右側做同樣的事情?
[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
作為我們現在做的最后一件事。
要“縮放”方程式的“右側”,您需要做的就是切換方程式,這樣您就可以從V
到X
進行取冪,並以對數的方式進行另一種方式。 原則上,就是這樣。 因為你還必須做一些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.