आप एक डोमेन जो 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 क्या आप अनुमान यह अपनी लॉग पैमाने बिगाड़ना जाएगा के रूप में चुन पर निर्भर करता है। आपके द्वारा उपयोग किए जाने वाले व्यापक अंतराल आपके पैमाने के निचले हिस्से को और अधिक बनाएंगे।