2011-11-16 18 views
9

में लॉगरिदमिक चार्ट क्या किसी को पता है कि फ्लोट में लॉगरिदमिक चार्ट कैसे बनाया जाए?फ्लोट

मूल रूप से मैं एक चार्ट है कि यहाँ दिखाया गया है (ऊपर बाएं) एक तरह लग रहा है बनाने के लिए कोशिश कर रहा हूँ: http://leto.net/plot/examples/logarithms.html

हालांकि, मैं यह एक कोशिश दे दिया है एक ही विकल्प का उपयोग कर, लेकिन यह चार्ट प्रदर्शित नहीं करता है उसी तरह। मुझे लगता है कि फ्लोट में बहुत सारे बदलाव हुए होंगे, क्योंकि यह मानते हुए कि पोस्ट काफी पुराना है।

किसी को भी किसी भी विचार है, तो कृपया मुझे पता है है।

धन्यवाद।

उत्तर

16

आप इस "परिणत" yaxis पर विकल्प का उपयोग कर सकते हैं।

काम here देखें।

$(function() { 
    // setup plot 
    function sampleFunction(x1, x2, func) { 
     var d = [ ]; 
     var step = (x2-x1)/300; 
     for (var i = x1; i < x2; i += step) 
      d.push([i, func(i) ]); 

     return d; 
    } 

    var options1 = { 
     lines: { show: true }, 
     xaxis: { ticks: 4 }, 
     yaxis: { ticks: [0.001,0.01,0.1,1,10,100], 
       transform: function(v) {return Math.log(v+0.0001); /*move away from zero*/}, 
       tickDecimals: 3 }, 
     grid: { hoverable: true, clickable: true, color: "#999" } 
    }; 

    var data1 = sampleFunction(0, 5, function(x){ return Math.exp(x)*Math.sin(x)*Math.sin(x) }); 

    var plot1 = $.plot($("#chart1"), [ { label: "exp(x)sin(x)^2", data: data1 } ], options1); 
}); 

पूर्ण कार्य कोड:

$(function() { 
 
    // setup plot 
 
    function sampleFunction(x1, x2, func) { 
 
     var d = [ ]; 
 
     var step = (x2-x1)/300; 
 
     for (var i = x1; i < x2; i += step) 
 
      d.push([i, func(i) ]); 
 

 
     return d; 
 
    } 
 
    
 
    var options1 = { 
 
     lines: { show: true }, 
 
     xaxis: { ticks: 4 }, 
 
     yaxis: { ticks: [0.001,0.01,0.1,1,10,100], 
 
       transform: function(v) {return Math.log(v+0.0001); /*move away from zero*/} , tickDecimals: 3 }, 
 
     grid: { hoverable: true, clickable: true , color: "#999"} 
 
    }; 
 
    
 
    var data1 = sampleFunction(0, 5, function(x){ return Math.exp(x)*Math.sin(x)*Math.sin(x) }); 
 
    
 
    var plot1 = $.plot($("#chart1"), [ { label: "exp(x)sin(x)^2", data: data1} ], options1); 
 
    
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.min.js"></script> 
 
<br/><br/> 
 
<div id="chart1" style="width:600px;height:300px;"></div>

+0

धन्यवाद मार्क। यही वही है जो मैं हासिल करना चाहता था। ऐसा लगता है कि यह Math.log (v + 0.0001); मेरी समस्या को हल करता है। मेरे पास + 0.0001 नहीं था और ग्राफ ठीक से आकर्षित नहीं करना चाहता था। – developer

+0

धन्यवाद मार्क। मामूली त्रुटि पेश करने के लिए, मैं v === 0 द्वारा Math.log (v + 0.0001) को प्रतिस्थापित करने की अनुशंसा करता हूं? शून्य: Math.log (v) (फ़्लोट उन बिंदुओं को प्रदर्शित नहीं करेगा जिनके लिए v शून्य है)। – sacha

+0

@ सचा, यह सुनिश्चित नहीं है कि धुरी एक शून्य मूल्य का जवाब कैसे देगी। मेरे पास यह कोड उत्पादन में है और मैंने वास्तव में इसे थोड़ा संशोधित किया: 'परिवर्तन: फ़ंक्शन (v) {वापसी v == 0? गणित।लॉग (0.00001): Math.log (v)}; ' – Mark

5

बढ़िया काम Mark

लघुगणक रेखांकन में Y अक्ष की टिक के रूप में की शक्ति का प्रारूप में हैं 10,

मैं Y अक्ष में वृद्धि साझा करना चाहते हैं टिक्स, Here यह is.s

$(function() { 
    // setup plot 
    function sampleFunction(x1, x2, func) { 
     var d = [ ]; 
     var step = (x2-x1)/300; 
     for (var i = x1; i < x2; i += step) 
      d.push([i, func(i) ]); 

     return d; 
    } 

    var options1 = { 
     lines: { show: true }, 
     xaxis: { ticks: 4 }, 
     yaxis: { ticks: [0.001,0.01,0.1,1,10,100], 
       transform: function(v) {return Math.log(v+0.0001); /*move away from zero*/} , tickDecimals: 3 , 
       tickFormatter: function (v, axis) {return "10" + (Math.round(Math.log(v)/Math.LN10)).toString().sup();} 
       }, 
     grid: { hoverable: true, clickable: true , color: "#999"} 
    }; 

    var data1 = sampleFunction(0, 5, function(x){ return Math.exp(x)*Math.sin(x)*Math.sin(x) }); 

    var plot1 = $.plot($("#chart1"), [ { label: "exp(x)sin(x)" + "2".sup(), data: data1} ], options1); 
}); 

कृपया मुझे बताएं कि क्या कोई बेहतर तरीका है चलो।

धन्यवाद।

2

के रूप में अन्य उत्तर देने कहा, अच्छा काम Mark। आपके समाधान को और अधिक मजबूत बनाने का एक तरीका है।

Mark's जवाब ज्यादातर मामलों के लिए काम करेंगे, लेकिन साजिश के पास या 0.0001 कम से कम मूल्यों के लिए सही नहीं होगा। साथ ही, आपको शून्य से दूर जाने के लिए प्रत्येक मान को संशोधित करने की आवश्यकता नहीं है। मेरा मानना ​​है कि प्लॉट निर्धारित करने के लिए 0 को बदलने की कोशिश करता है कि साजिश का "नीचे" होना चाहिए। इस वजह से, आप अपनी साजिश धुरी गतिशील गति को बनाने में सक्षम नहीं होंगे। यदि आपके मूल्य 0.0001 से अधिक हैं तो इससे आपके प्लॉट बहुत खराब दिखाई देंगे। इसलिए, निम्नलिखित संशोधन मार्क के समाधान को और अधिक मजबूत बनाता है, लेकिन इसे आपके डेटा में न्यूनतम वाई मान (नीचे नीचे) जानने की आवश्यकता है।

var options1 = { 
    lines: { show: true }, 
    xaxis: { ticks: 4 }, 
    yaxis: { ticks: [0.001,0.01,0.1,1,10,100], 
      transform: Function("v","return v == 0 ? Math.log("+Math.pow(10,ymin)+") : Math.log(v);"), tickDecimals: 3 }, 
    grid: { hoverable: true, clickable: true , color: "#999"} 
}; 
0

यह आधार 10 है। दृष्टिकोण यह नहीं होना चाहिए?

transform: function (v) { 
    if (v == 0) v = 0.0001; 
    return Math.log(v)/Math.log(10); 
}, 
inverseTransform: function (v) { 
    Math.pow(10, v); 
}, 
संबंधित मुद्दे