2013-01-25 7 views
5

मैं flot (flot on github) का उपयोग कर रहा निम्नलिखित समय श्रृंखला डेटा के साथ एक ग्राफ आकर्षित करने के लिए:वाई-अक्ष पर लापता समय श्रृंखला को बिंदु शून्य पर आकर्षित करने के लिए फ़्लोट को कॉन्फ़िगर कैसे करें?

[ 
    [1357171200000, 1], 
    [1357344000000, 1], 
    [1357430400000, 2], 
    [1357516800000, 2], 
    [1357689600000, 3], 
    [1357776000000, 1] 
] 

तुम वहाँ ग्राफ जिसमें कुछ अंक भी दिन के लिए बिक्री शो कर रहे हैं देख सकते हैं। मेरी जेसन प्रतिक्रिया में उन दिनों के लिए बिक्री गणना/डेटा नहीं है जहां कोई बिक्री नहीं हुई है। उदाहरण के लिए 04 जनवरी। मैं बिंदु शून्य पर वाई-अक्ष पर लापता दिनों को आकर्षित करने के लिए फ़्लोट को कैसे कॉन्फ़िगर कर सकता हूं (क्योंकि कोई बिक्री नहीं है)? जैसा कि आप छवि फ़्लोट में देख सकते हैं, अंक को जोड़ता है ताकि ग्राफ़ में कोई शून्य बिंदु न हो।

Graph

+0

संभावित रूप से गायब लोगों को खोजने के लिए सभी तिथियों का निरीक्षण करना होगा ... सप्ताह के सभी दिन या केवल सोमवार-शुक्रवार? – charlietfl

+0

उपयोगकर्ता डेट पिकर के साथ समय सीमा चुनने में सक्षम है। इसलिए समय सीमा हो सकती है जो बहुत छोटी है या एक समय सीमा है जो बहुत बड़ी है (महीनों या वर्षों में)। मैं अंतराल को भरने के लिए जेसन डेटा को संशोधित नहीं करना चाहता हूं। तो मैंने सोचा कि शायद फ्लोट इस बिल्ड-इन कर सकता है? – whitenexx

उत्तर

15

यहाँ एक समाधान है कि शून्य करने के लिए लापता दिनों में जोड़ने और उनके मूल्यों की स्थापना एक नई सरणी बनाता है :

/* create and return new array padding missing days*/ 
function newDataArray(data) { 
    var startDay = data[0][0], 
    newData = [data[0]]; 

    for (i = 1; i < data.length; i++) { 
    var diff = dateDiff(data[i - 1][0], data[i][0]); 
    var startDate = new Date(data[i - 1][0]); 
    if (diff > 1) { 
     for (j = 0; j < diff - 1; j++) { 
     var fillDate = new Date(startDate).setDate(startDate.getDate() + (j + 1)); 
      newData.push([fillDate, 0]); 
     } 
    } 
    newData.push(data[i]); 
    } 
    return newData; 
} 


/* helper function to find date differences*/ 
function dateDiff(d1, d2) { 
    return Math.floor((d2 - d1)/(1000 * 60 * 60 * 24)); 
} 

का उपयोग करें:

var data = [ 
    [1357171200000, 1], 
    [1357344000000, 1], 
    [1357430400000, 2], 
    [1357516800000, 2], 
    [1357689600000, 3], 
    [1357776000000, 1] 
]; 

var newData=newDataArray(data); 
/* pass newData to flot*/ 

डेमो: http://jsfiddle.net/LK2gD/3/

+0

एक आकर्षक की तरह काम करता है ;-) – whitenexx

+0

इसे प्राप्त करने का सही तरीका। अच्छा है :) – Adam

2

तो, आप दैनिक गिनती की है। फिर आप प्रत्येक प्रविष्टि से अधिक पुनरावृति और वर्तमान प्रविष्टि और अगले एक के बीच दिन के नंबर मिल सकता है, तो आप सिर्फ 0.

के साथ सरणी को भरने के लिए यह एक शून्य भरा सरणी का उपयोग करने में काफी बेहतर है की आवश्यकता होगी फिर अपनी वर्तमान सरणी में मौजूद तारीख के लिए केवल गिनती जोड़ें, तो आपको तिथि पर कोई भी जांच करने की आवश्यकता नहीं होगी।

आप दैनिक अंतराल

var millisInDay = 1000*60*60*24; 

यह आपको दैनिक अंतराल की संख्या

var intervals = parseInt(((lastDateInMillis - startDateInMillis)/ 
            millisInDay) + 1); 

तो दे देंगे जब आप तारीख

के अपने सरणी
[[1357171200000, 1], [1357344000000, 1], [1357430400000, 2], 
[1357516800000, 2], [1357689600000, 3], [1357776000000, 1]] 

चेक से अधिक पुनरावृति जो अंतराल में तारीख है, और 'अंतराल' सरणी () में गिनती अपडेट करें)

var interval = ((currentDateMillis - startDateInMillis)/millisInDay); 
counts[interval] += currentCount; 

और फिर आप किसी खास दिन के साथ गिनती मैप करने के लिए index साथ खेल सकते हैं:

function getEpochStartInterval(index){ 
    return startDateInMillis + (index * millisInDay); 
} 

function getEpochEndInterval(index){ 
    return startDateInMillis + ((index + 1) * millisInDay); 
} 
संबंधित मुद्दे