2011-12-21 4 views
7

が長いなどのXピクセルラインを考える:0 <= V <= max場合リニアX対数スケール

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

、リニアスケールでV位置がX/max*Vピクセルになります。

対数スケールのピクセル位置を計算し、ピクセル位置から始めるにはどうすればVの値を戻すことができますか?

  1. それは私が私が対数スケールでの効果を持つPythonの

が好き

  • (コメントはありません "FOO-plotlibを使用する"、してください)数学を知りたい宿題
  • ではありませんスケールの左側を「ズーム」します。代わりに同じことを右側に行うことは可能ですか?

    [更新日]

    数学のおかげです!

    私は対数を使いませんでした。私は単にスケールの中心として(値のセットで)平均値を使用しました。このコントロールは、choropleth chartを描画するために使用される一連の値のグループ境界パーセンタイルを選択するために使用されます。

    ユーザが対称スケール(赤いマーク=平均、グリーンマーク=センター、闇値の出現数を表す)を選択した場合: enter image description here

    を非対称スケールがきめ細かい調整が容易になり: enter image description here

  • +0

    すべての値のログを取り、残りは同じです。 0(log(0)は負であることはできません)に注意してください。また、記号を交差させないでください。 – yosukesabai

    +0

    @yosukesabai: 'max'の値が非常に低い場合のヒント? –

    +2

    これは '(X/max)* V'であり、' X * V/max'として読みやすくなります – wim

    答えて

    13

    だから、あなたは、いくつかの任意の値Vを持っている、とあなたは0 < = V < = Vmaxことを知っています。ピクセルのx座標を計算したい場合は、Xと呼びます。ここでは、「スクリーン」のx座標は0からXmaxまでです。あなたが言うように、この「通常」の方法を行うために、あなたは私が最初にV/Vmaxを計算することにより、0と1の間にあるように値を正規化してるようにそれを考えるのが好き、そして

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

    にしてくださいこの値に最大値を掛けて、0とその最大値の間の値を取得します。

    同じログを行うには、Vの値に異なる下限値が必要です。 Vがいつでも< = 0であれば、ValueErrorとなります。それでは0とすると、< Vmin < = V < = Vmaxとなります。次に、を調べる必要があります。無限に多いので、使用する対数はです。我々は左に表現から指数で得ることができる場合、原則的にはそう

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

    、:3つは、一般的に、次のようになり、x軸にもたらされるベース2、E及び10を有するものを、遭遇しています我々は0とXmaxの間の値を取得するには、上記と同じ原理を使用することができ、およびログの出番これはもちろんであるあなたがベース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)があなたに非負性を与えることを確認する必要があることを除いて、ほぼ同じ考え方ですe値。これを行うには、関数内のVminで除算します。これで、式が得られる最大値で除算することができます。これはもちろんlog(Vmax/Vmin, b)です。これまでと同じように、0と1の間の値が得られます。

    最初に正規化(X/Xmax)する必要があるもう1つの方法は、逆関数によって予想される最大値(* 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 
    
    2
      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 <は対数が定義されていない)。

    2

    これは、他の機能でも簡単に拡張できます。スペースの私の尺度は、ピクセルの代わりに文字で与えられます(つまり、max == chars(またはpixels))。
    正の値のみです。

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

    enter image description here

    上記FOO-plotlibとはみなされません願っています。しかし、それは気が!これはとても〜です ! :-)

    関連する問題