दिलचस्प पोस्ट
जावा: मैं एक छोटे से सरणी सूची में एक सरणी सूची को कैसे विभाजित कर सकता हूँ? एचटीएमएल में "सभी का चयन करें" चेक बॉक्स कैसे कार्यान्वित करें? टाइप वैरिएबल का प्रयोग करके एक चर कास्टिंग करना क्या एक जावास्क्रिप्ट एमवीसी (माइक्रो-) फ्रेमवर्क है? प्रस्तुतकर्ता विशेषता द्वारा कितनी बार बुलाया जाता है? एक plpgsql फ़ंक्शन में तालिका और स्तंभ नामों को तर्क के रूप में परिभाषित करें? सेलेनियम वेब ड्रिवर और ड्रॉपडाउन बॉक्स एचटीएमएलएक्स वीडियो: बफरिंग का बल निरस्त करना पायथन यूनिकोड एन्कोड त्रुटि iTextSharp – ई-मेल संलग्नक में इन-मेमोरी पीडीएफ भेजा जा रहा है इनपुट को डिफ़ॉल्ट मान कैसे सेट करें MySQL में WHERE खंड के साथ अनुक्रमणिका का उपयोग नहीं किया जा रहा है? मैं कैसे चेक कर सकता हूं कि जावास्क्रिप्ट के साथ एक रेडियो बटन चुना गया है? यदि कोई संख्या प्रधान है तो यह जांचने के लिए सबसे अच्छा एल्गोरिथ्म क्या है? ViewBag, ViewData और TempData

क्या एक तरह से सरणी के रूप में संपूर्ण कुंजी को एक सिंगल कुंजी के रूप में रखने के बजाय अलग-अलग रिकॉर्ड के रूप में सरणी के तत्वों का इलाज करने के लिए क्रॉसफिल्टर को बताने का कोई तरीका है?

मेरे पास डेटा सेट है, जहां कुछ फ़ील्ड वैल्यू एरेज़ हैं और मैं हिस्टोग्राम को प्रदर्शित करने के लिए crossfilter और d3.js या dc.js का उपयोग करना चाहता हूं कि कितने समय डेटासेट में मौजूद प्रत्येक मान मौजूद था।

यहां एक उदाहरण है:

var data = [ {"key":"KEY-1","tags":["tag1", "tag2"]}, {"key":"KEY-2","tags":["tag2"]}, {"key":"KEY-3","tags":["tag3", "tag1"]}]; var cf = crossfilter(data); var tags = cf.dimension(function(d){ return d.tags;}); var tagsGroup = tags.group(); dc.rowChart("#chart") .renderLabel(true) .dimension(tags) .group(tagsGroup) .xAxis().ticks(3); dc.renderAll(); 

और JSFiddle http://jsfiddle.net/uhXf5/2/

जब मैं उस कोड को चलाता हूं तो यह इस तरह ग्राफ का उत्पादन करता है:

ग्राफ 1

लेकिन मैं क्या चाहता हूं, ऐसा कुछ है:

यहां छवि विवरण दर्ज करें

चीजों को और भी जटिल बनाने के लिए, क्लिक किए गए टैग द्वारा किसी भी पंक्तियों पर क्लिक करने और डेटासेट को फ़िल्टर करने में सक्षम होने के लिए यह शानदार होगा।

किसी को भी यह कैसे प्राप्त करने के लिए कोई विचार है?

धन्यवाद, कोस्त्या

वेब के समाधान से एकत्रित समाधान "क्या एक तरह से सरणी के रूप में संपूर्ण कुंजी को एक सिंगल कुंजी के रूप में रखने के बजाय अलग-अलग रिकॉर्ड के रूप में सरणी के तत्वों का इलाज करने के लिए क्रॉसफिल्टर को बताने का कोई तरीका है?"

इसे स्वयं हल कर, यहां काम करने वाला कोड बेला है http://jsfiddle.net/uhXf5/6/

किसी भी व्यक्ति ने इसी तरह की समस्या के मामले में यह कोड दिया है:

 function reduceAdd(p, v) { v.tags.forEach (function(val, idx) { p[val] = (p[val] || 0) + 1; //increment counts }); return p; } function reduceRemove(p, v) { v.tags.forEach (function(val, idx) { p[val] = (p[val] || 0) - 1; //decrement counts }); return p; } function reduceInitial() { return {}; } var data = [ {"key":"KEY-1","tags":["tag1", "tag2"], "date":new Date("10/02/2012")}, {"key":"KEY-2","tags":["tag2"], "date": new Date("10/05/2012")}, {"key":"KEY-3","tags":["tag3", "tag1"], "date":new Date("10/08/2012")}]; var cf = crossfilter(data); var tags = cf.dimension(function(d){ return d.tags;}); var tagsGroup = tags.groupAll().reduce(reduceAdd, reduceRemove, reduceInitial).value(); // hack to make dc.js charts work tagsGroup.all = function() { var newObject = []; for (var key in this) { if (this.hasOwnProperty(key) && key != "all") { newObject.push({ key: key, value: this[key] }); } } return newObject; } var dates = cf.dimension(function(d){ return d.date;}); var datesGroup = dates.group(); var chart = dc.rowChart("#chart"); chart .renderLabel(true) .dimension(tags) .group(tagsGroup) .filterHandler(function(dimension, filter){ dimension.filter(function(d) {return chart.filter() != null ? d.indexOf(chart.filter()) >= 0 : true;}); // perform filtering return filter; // return the actual filter value }) .xAxis().ticks(3); var chart2 = dc.barChart("#chart2"); chart2 .width(500) .transitionDuration(800) .margins({top: 10, right: 50, bottom: 30, left: 40}) .dimension(dates) .group(datesGroup) .elasticY(true) .elasticX(true) .round(d3.time.day.round) .x(d3.time.scale()) .xUnits(d3.time.days) .centerBar(true) .renderHorizontalGridLines(true) .brushOn(true); dc.renderAll(); 

उपरोक्त उदाहरण एक महान दृष्टिकोण है आप इसे एक कदम आगे भी ले सकते हैं। उपर्युक्त समाधान में, यह केवल आपके द्वारा बनाई गई पहली चयन के आधार पर फ़िल्टर होगा। किसी भी बाद के चयनों पर ध्यान नहीं दिया जाता है।

यदि आप चाहते हैं कि वह सभी चयनों का जवाब दे, तो आप फ़िल्टरहालर को निम्न प्रकार से बनायेंगे:

  barChart.filterHandler (function (dimension, filters) { dimension.filter(null); if (filters.length === 0) dimension.filter(null); else dimension.filterFunction(function (d) { for (var i=0; i < d.length; i++) { if (filters.indexOf(d[i]) >= 0) return true; } return false; }); return filters; } ); 

यहां कार्यशील नमूना: http://jsfiddle.net/jeffsteinmetz/cwShL/

जेफ और कोस्त्या द्वारा सूचीबद्ध दृष्टिकोण के लिए मैं कुछ संदर्भ प्रदान करने की कोशिश करना चाहता हूं

आप देखेंगे कि टैग समूह समूह का उपयोग करता है सभी विशिष्ट समूह विधि के विपरीत नहीं हैं क्रॉसफिल्टर हमें बताता है कि "लौटा दिया गया ऑब्जेक्ट मानक समूह के समान है, सिवाय इसकी कोई शीर्ष या ऑर्डर विधि नहीं है। इसके बजाय, सभी मेलिंग रिकॉर्ड्स के मूल्य को कम करने के लिए मान का उपयोग करें।" कोस्तया ने एक समूह को ".value ()" विधि कहा, जो संपूर्ण समूह का प्रतिनिधित्व करता है।

 var tagsGroup = tags.groupAll().reduce(reduceAdd, reduceRemove, reduceInitial).value(); 

यह ऑब्जेक्ट dc.js के साथ अच्छी तरह से काम नहीं करेगा क्योंकि dc.js को उम्मीद है कि ग्रुप ऑब्जेक्ट के पास सभी पद्धति हो। कोस्तया ने उस ऑब्जेक्ट को "सभी" पद्धति की तरह समझाया:

 // hack to make dc.js charts work tagsGroup.all = function() { var newObject = []; for (var key in this) { if (this.hasOwnProperty(key) && key != "all") { newObject.push({ key: key, value: this[key] }); } } return newObject; } 

यह एक साधारण dc.js चार्ट के साथ काम करेगा, लेकिन आप सभी dc.js कार्यक्षमता का उपयोग करने में सक्षम नहीं होंगे क्योंकि सभी समूह कार्य मौजूद नहीं हैं। उदाहरण के लिए, आप अपने चार्ट पर "टोपी" विधि का उपयोग करने में सक्षम नहीं होंगे क्योंकि टोपी पद्धति की उम्मीद है कि समूह ऑब्जेक्ट को "टॉप" विधि के पास रखना होगा आप शीर्ष विधि को भी इस तरह से पैच कर सकते हैं:

 topicsGroup.top = function(count) { var newObject = this.all(); newObject.sort(function(a, b){return b.value - a.value}); return newObject.slice(0, count); }; 

यह आपके चार्ट को कैप विधि का उपयोग करने में सक्षम करेगा:

 barChart .renderLabel(true) .height(200) .dimension(topicsDim) .group(topicsGroup) .cap(2) .ordering(function(d){return -d.value;}) .xAxis().ticks(3); 

एक अद्यतन उदाहरण http://jsfiddle.net/djmartin_umich/m7V89/#base पर उपलब्ध है

जेफ का उत्तर काम करता है, लेकिन "पाया" वैरिएबल का ट्रैक रखने की कोई आवश्यकता नहीं है या यदि कोई आइटम मिल गया तो पाश जारी रखें। यदि एक्स [एक्स, वाई, जेड] में है, तो इससे पहले ही 1/3 में पुनरावृत्तियों की मात्रा में कटौती हुई है

 else dimension.filterFunction(function (d) { for (var i=0; i < d.length; i++) { if (filters.indexOf(d[i]) >= 0) return true; } return false; }); 

वैकल्पिक रूप से, आप dc.js filterFunction विधि पैच कर सकते हैं और जो सभी मामलों को संभाल लेंगे।

यह अब बहुत आसान है, क्योंकि crossfilter और dc crossfilter साथ आयामों का समर्थन करते हैं। संदर्भ और उदाहरण के लिए इस प्रश्न को देखें: dc.js / crossfilter में एरे के साथ आयाम का उपयोग करना