2011-12-21 19 views
7

एक लाइन X पिक्सल को देखते हुए लंबे समय से की तरह:रैखिक एक्स लघुगणकीय पैमाने

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

0 <= V <= max हैं, रैखिक पैमाने में V स्थिति X/max*V पिक्सल होगा।

मैं लॉगरिदमिक पैमाने के लिए पिक्सेल स्थिति की गणना कैसे कर सकता हूं, और पिक्सेल स्थिति से शुरू कैसे कर सकता हूं मैं वी के मूल्य को वापस कैसे प्राप्त कर सकता हूं?

  1. यह होमवर्क
  2. नहीं है मैं गणित (कोई टिप्पणी नहीं, कृपया "का उपयोग फू-plotlib")
  3. मैं अजगर

एक लघुगणकीय पैमाने की तरह जानना चाहता हूँ की प्रभाव पड़ता है पैमाने के बाईं तरफ "ज़ूमिंग"। क्या इसके बजाय दाहिने तरफ एक ही चीज़ करना संभव है?

[अद्यतन]

गणित पाठ के लिए धन्यवाद!

मैं लॉगरिदम का उपयोग नहीं कर पाया। मैंने स्केल के केंद्र के रूप में औसत मान (मूल्यों के एक सेट में) का उपयोग किया है। इस नियंत्रण का उपयोग मूल्य सीमा के सेट के लिए समूह सीमा प्रतिशत का चयन करने के लिए किया जाता है जिसका उपयोग choropleth chart को आकर्षित करने के लिए किया जाएगा।

उपयोगकर्ता एक सममित पैमाने (लाल निशान = औसत, हरे निशान = सेंटर, अंधेरे एक मूल्य की पुनरावृत्ति की संख्या का प्रतिनिधित्व करता है) चुनता है: : enter image description here

एक असममित पैमाने सुक्ष्म समायोजन आसान बना देता है enter image description here

+0

सभी मानों का लॉग लें और बाकी एक ही है। सावधान रहें कि आपके पास शून्य नहीं हो सकता है (लॉग (0) ऋणात्मक है। inf) और न ही – yosukesabai

+0

@ योसुकेसाबाई को पार करें: 'अधिकतम' के बहुत कम मूल्यों से निपटने के तरीके के बारे में कोई संकेत? –

+2

यह '(एक्स/अधिकतम) * वी' है, और 'एक्स * वी/अधिकतम' – wim

उत्तर

13

तो तुम कुछ मनमाना मूल्य V मिल गया है, और आप जानते हैं कि 0 < = V < = Vmax। आप एक पिक्सेल के एक्स-समन्वय की गणना करना चाहते हैं, इसे X पर कॉल करें, जहां आपकी "स्क्रीन" में 0 से Xmax से x-coordinates हैं। आप कहते हैं के रूप में, इस "सामान्य" जिस तरह से करने के लिए, आप

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

करना चाहते हैं तो मैं इसके बारे में सोचने के लिए की तरह मैं पहली बार की गणना V/Vmax द्वारा मूल्य को सामान्य कर रहा हूँ 0 और 1 के बीच झूठ पसंद है, और मैं अधिकतम और अधिकतम के बीच मान प्राप्त करने के लिए अधिकतम से इस मान को गुणा करता हूं।

वही लॉगरिटिक रूप से करने के लिए आपको V मान के लिए एक अलग निचली सीमा की आवश्यकता है। यदि वी < = 0 है, तो आपको ValueError मिलता है। तो मान लें 0 < Vmin < = V < = Vmax। फिर आपको उपयोग करने के लिए लॉगरिदम का पता लगाने की आवश्यकता है, क्योंकि उनमें से कई असीमित हैं।तीन सामान्यतः सामना होता है, कि इस तरह दिखना आधार 2, ई और 10 है, जो एक्स-अक्ष में जो परिणाम के साथ उन:

------|------|------|------|----  ------|------|------|------|---- 
    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 के बीच कोई मान प्राप्त करने के लिए, और इस पाठ्यक्रम जहां लॉग में आता है की है आप आधार 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), फिर उलटा funciton द्वारा अधिकतम उम्मीद (* logmax) फिर से स्केल करें। इसके विपरीत, कुछ मूल्यों के लिए b बढ़ाने के लिए विपरीत है। अब X 0 है, b ** (logmax * X/Xmax) 1 बराबर होगा, इसलिए सही निचली सीमा प्राप्त करने के लिए हम Vmin से गुणा करें। या इसे एक और तरीका डालने के लिए, क्योंकि पहली बात यह है कि हम दूसरी तरफ जा रहे थे Vmin द्वारा विभाजित करना, हमें Vmin के साथ गुणा करने की आवश्यकता है जो हम अब करते हैं।

"ज़ूम" समीकरण के "दाईं ओर" करने के लिए, तुम सब करने की जरूरत है स्विच समीकरण है, तो आप V से X के लिए जा रहा है और लघुगणक अन्य रास्ते पर जा रहा ले exponentiate। सिद्धांत रूप में, वह है। क्योंकि आप भी सच है कि 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) 

(बी लघुगणक का आधार है)

जाहिर है आप यह सुनिश्चित करना चाहिए कि वी> = 1 (वी = 1 pos = 0 के अनुरूप होगा, वी = 0..1 -inf..0 से मेल खाता है, और वी < 0 लॉगरिदम परिभाषित नहीं किया गया है)।

2

इसे अन्य कार्यों के लिए आसानी से बढ़ाया जा सकता है। अंतरिक्ष का मेरा माप पिक्सेल के बजाय वर्णों में दिया जाता है (यही कारण है कि अधिकतम == वर्ण (या पिक्सेल) क्यों।
केवल सकारात्मक मूल्यों के लिए।

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

से ऊपर नहीं माना जाता है फू-plotlib आशा है। लेकिन यह लानत है! यह ऐसा ही है ! :-)

संबंधित मुद्दे