2013-01-11 15 views
7

घोंसला बनाने से मैं टीम सहयोग डेटा कल्पना करने के लिए कोशिश कर रहा हूँ इस तरह एक तरह से, के साथ बनाया फ़्लैट करें।एक वस्तु पदानुक्रम d3.js

स्रोत से डेटा इस तरह दिखता है:

var json = [ 
    { 
     "teamLabel": "Team 1", 
     "created_date": "2013-01-09", 
     "typeLabel": "Email" 
     "count": "5" 
    }, 
    { 
     "teamLabel": "Team 1", 
     "created_date": "2013-01-10", 
     "typeLabel": "Email" 
     "count": "7" 
    }, 
    /* and of course, a lot more data of this kind */ 
] 

ध्यान दें कि डेटा एकल दिनों के लिए दिया जाता है। तो उपरोक्त विज़ुअलाइज़ेशन के लिए, मुझे पहले वर्ष के सप्ताह के आधार पर डेटा एकत्र करना होगा। टीम का नाम और आर्टिफैक्ट प्रकार को संरक्षित करने की आवश्यकता है और समूह गुणों के रूप में उपयोग किया जाता है। यहां कोड है:

// "2013-01-09" 
var dateFormat = d3.time.format.utc("%Y-%m-%d"); 

// "2013-02" for the 2nd week of the year 
var yearWeek = d3.time.format.utc("%Y-%W"); 

var data = d3.nest().key(function(d) { 
     return d.teamLabel; 
    }).key(function(d) { 
     var created_date = dateFormat.parse(d.created_date); 
     return yearWeek(created_date); 
    }) 
    .key(function(d) { 
     return d.typeLabel; 
    }).rollup(function(leaves) { 
     return d3.sum(leaves, function(d) { 
       return parseInt(d.count); // parse the integer 
      }); 
     } 
    ) 
    .map(json); 

इसका परिणाम घोंसले कुंजी के आधार पर ऑब्जेक्ट पदानुक्रम में होता है। मैं इस से ऊपर चार्ट बनाने के लिए कैसे नहीं दिख रहा है, इसलिए मैं नहीं बल्कि एक तरह से देख रहा हूँ निम्नलिखित संरचना में data कन्वर्ट करने के लिए:

[ 
    // This list contains an element for each donut 
    { 
     "teamLabel": "Team 1", 
     "createdWeek": "2013-02", 
     "values": [ 
      // This list contains one element for each type we found 
      { 
       "typeLabel": "Email", 
       "count": 12 
      }, 
      { 
      ... 
      } 
     ] 
    }, 
    { 
    ... 
    } 
] 

इस तरह, मैं एक्स पर स्थिति के लिए createdWeek और teamLabel उपयोग कर सकते हैं - और y-axis क्रमशः, और values के तहत जानकारी d3.layout.pie() पर जा सकती है।

क्या इस डेटा परिवर्तन को करने का कोई साफ तरीका है? अगर आपको किसी स्पष्टीकरण या अधिक जानकारी की आवश्यकता है, तो कृपया मुझे बताएं।

+1

क्या तुमने कभी कैसे बाहर मिला यह करने के लिए? –

+0

@cyroxx मुझे यकीन नहीं है कि मैं आपका प्रश्न समझता हूं; आप टीम द्वारा समूहित नए सरणी प्रारूप में प्रस्तुत किए गए 'जेसन' डेटा को कन्वर्ट करना चाहते हैं? – hitautodestruct

+0

मैं उलझन में हूं कि आप इस फ़्लैटनिंग को क्यों कहते हैं, जब ऐसा लगता है कि आप मूल रूप से फ्लैट डेटा में परत जोड़ रहे हैं। (मैं एक नेस्टेड डेटा सेट को फ़्लैट करना चाहता हूं।) – punstress

उत्तर

3

कि तुम कैसे करते:

var flat = data.entries().map(function(d){ 
    return d.value.entries().map(function(e){ 
     return { 
      "teamLabel": d.key, 
      "createdWeek": e.key, 
      "values": e.value.entries().map(function(f){ 
       return {"typeLabel": f.key, "count": f.value} 
      }) 
     } 
    }) 
}).reduce(function(d1,d2){ return d1.concat(d2) },[]); 

ध्यान दें कि मैं आदेश map.entries() सहायक समारोह का उपयोग करने के बजाय d3.map उपयोग कर रहा हूँ मानक जावास्क्रिप्ट वस्तु की। मुझे लगता है कि क्या आप इस तथ्य है कि आप उपयोग कर रहे द्वारा पहचानने की कोशिश की है:

.map(json); // whereas I used .map(json, d3.map) 
बजाय

.entries(json); 

jsFiddle यहाँ लिंक:

http://jsfiddle.net/RFontana/KhX2n/

+1

आपका लिंक सही जेसन नहीं दिखाता है? – thatOneGuy