2012-07-04 11 views
7

मैं पुस्तकालय d3.js.I पर वर्तमान कार्यशील हूँ का उपयोग कर लाइन ग्राफ का उपयोग कर Dynamic Line Graph यहाँ हम बिजली रैखिक ड्राइंग और लॉग का विकल्प होता है की है। लेकिन मेरी समस्या यह है कि मेरे डेटा सेट में मेरे पास कुछ मान शून्य हो सकते हैं और लॉग 0 को अपरिभाषित किया गया है, इसलिए कोड इसे साजिश करने में असमर्थ है। यहाँ मेरी कोड में पैमाने इसग्राफ में शून्य लोग इन से बचने के लिए कैसे d3.js

y = d3.scale.log().domain([0.1, max_y _value]).range([h, 0]).nice(); 

की तरह सेट किया है और इस लिए कि यह कैसे

lineFunction = d3.svg.line() 
     .y(function(d) { 
      return y(d); 
     }); 

मुझे पता है कि इसकी एक अजीब question.But वहाँ एक रास्ता है जिसके द्वारा मैं लॉग संभाल सकता है इस्तेमाल किया जाता है 0 मान ताकि अगर मेरे पास शून्य शून्य मान है तो उनमें से बाकी को सही ढंग से प्लॉट किया गया है। क्या मैं दो अक्षरों और श्रेणी को उसी कथन में (0 मान को संभालने के लिए) दे सकता हूं यदि हां, तो यह वाई अक्ष से कैसे बंधेगा?

धन्यवाद किसी भी मदद की सराहना की जाएगी।

उत्तर

12

मैंने clamp फ़ंक्शन का उपयोग कर अपनी समस्या हल की। यह कैसे मैं कोड बदल दिया है है:

y = d3.scale.log().clamp(true).domain([0.1, max_y _value]).range([h, 0]).nice(); 
2

आप एक डोमेन जो 0 लॉग पैमाने के रूप में डोमेन सीमाओं में से एक आप के लिए काम नहीं करेगी है। इसके अलावा लॉग स्केल आपको टच() फ़ंक्शन प्रदान करता है जिसमें बिना छेड़छाड़ की संख्या शामिल है।

मेरा वर्तमान असाइनमेंट मनमानी डोमेन और श्रेणियों के साथ एक रैखिक स्केल किए गए स्कैटर चार्ट पर डेटा प्रदर्शित करना है लेकिन वैकल्पिक रूप से उपयोगकर्ता लॉगरिदमिक पैमाने पर बदल सकता है। इसमें समस्याग्रस्त [0, एन] और [एन, 0] डोमेन शामिल हैं।

यहां एक समाधान है जो मैं इन मामलों को संभालने के लिए आया था: यदि हम अपने डोमेन को सकारात्मक सीमाओं के साथ मनमाने ढंग से रेंज करने के लिए एक रैखिक पैमाने का उपयोग कर रहे हैं तो समस्या से बचा जा सकता है। मैं [1,10] चुनता हूं लेकिन यह कोई सकारात्मक संख्या ले सकता है। इसके बाद हम एक सामान्य लॉग पैमाने का उपयोग कर सकते हैं।

d3.scale.genericLog = function() { 
    return GenericLog(); 
}; 
function GenericLog() { 
    var PROJECTION=[1,10]; 
    var linearScale, logScale; 

    linearScale=d3.scale.linear(); 
    linearScale.range(PROJECTION); 

    logScale=d3.scale.log(); 
    logScale.domain(PROJECTION); 

    function scale(x) { 
     return logScale(linearScale(x)); 
    } 
    scale.domain = function(x) { 
     if (!arguments.length) return linearScale.domain(); 
     linearScale.domain(x); 
     return scale; 
    }; 
    scale.range = function(x) { 
     if (!arguments.length) return logScale.range(); 
     logScale.range(x); 
     return scale; 
    }; 
    scale.ticks = function(m) { 
     return linearScale.ticks(m); 
    }; 
    return scale; 

} 

उपयोग:

var scale1 = d3.scale.genericLog().domain([0,1]).range([500,1000]); 
var scale2 = d3.scale.genericLog().domain([-10,0]).range([500,1000]); 
scale1(0) //500 
scale2(-10) //500 
scale2(0) //100 

मैं केवल रेंज(), पैमाने(), टिक्स() फ़ंक्शन तो मैं केवल इन शामिल है, लेकिन यह 5 मिनट से अधिक नहीं ले सभी को लागू करने चाहिए की जरूरत दूसरे। साथ ही: ध्यान दें कि मैं रैखिक पैमाने के टिक() मानों का उपयोग कर रहा था क्योंकि मुझे टिकों की संख्या सीमित करना था और यह रैखिक पैमाने के साथ आसान है।

संपादित करें: बारे में पता BE क्या आप अनुमान यह अपनी लॉग पैमाने बिगाड़ना जाएगा के रूप में चुन पर निर्भर करता है। आपके द्वारा उपयोग किए जाने वाले व्यापक अंतराल आपके पैमाने के निचले हिस्से को और अधिक बनाएंगे।