2014-05-06 7 views
7

मैं डेटासेट के अच्छे बबल चार्ट को प्रस्तुत करने के लिए dc.js का उपयोग कर रहा हूं। अंतर्निहित dc.js crossfilter है।क्रॉसफ़िल्टर डेटा को बदलें, आयामों और समूहों को पुनर्स्थापित करें

मैं सर्वर से नए डेटा के साथ अपने चार्ट को आसानी से रीफ्रेश करना चाहता हूं। crossfilter

  • नए डेटा
  • dc.redrawAll() बुला में जोड़ने से

    1. सभी डेटा को हटाने: This issue on Github यह स्पष्ट है कि इस से ऐसा करने के लिए संभव है कि बनाता है।

    मुझे यह काम मिल गया है लेकिन सभी डेटा को हटाने के लिए, आपको पहले सभी फ़िल्टर साफ़ करना होगा (क्योंकि crossfilter.remove केवल वर्तमान फ़िल्टर से मेल खाने वाले रिकॉर्ड को हटा देता है)।

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

    इसके अतिरिक्त: यदि कोई अद्वितीय कुंजी के आधार पर क्रॉसफ़िल्टर डेटा अपडेट करने का तरीका जानता है, तो वह सोने की धूल होगी!

  • +1

    क्या आप केवल डेटा जोड़ रहे हैं? तब मैं crossfilter.add ([डेटा]) का उपयोग कहूंगा। यदि आपको डेटा को भी हटाने की आवश्यकता है, तो मेरे पास प्रस्ताव देने के लिए बहुत कुछ नहीं है, लेकिन हो सकता है कि आप इस मुद्दे पर नज़र डालें और टिप्पणी करें कि यह सही दिशा की तरह लगता है: https://github.com/square/crossfilter/मुद्दों/109 –

    +0

    @EthanJewitt मैं * या * डेटा को हटा नहीं रहा हूं। मैं मौजूदा डेटा अपडेट कर रहा हूं, प्रत्येक पंक्ति विशिष्ट रूप से कुंजी है। या कुंजी के आधार पर अपडेट करने की सुविधा 'add'' है? – LondonRob

    +0

    गोटो - तो आपको पुराने डेटा को हटाने और नया डेटा जोड़ने की आवश्यकता है (जहां तक ​​मुझे पता है मौजूदा कुंजी को अपडेट करने की कोई क्षमता नहीं है)। उस क्षमता वास्तव में इस समय मौजूद नहीं है क्योंकि आपको अपने डेटा को हटाने के लिए सभी फ़िल्टरों को हटाना होगा। निजी तौर पर, मुझे लगता है कि यह ऐसा कुछ है जिसे क्रॉसफिल्टर में संबोधित करने की आवश्यकता है, और इस मुद्दे पर कुछ चर्चा है कि इसे कैसे हल किया जाए, लेकिन मुझे नहीं लगता कि किसी के पास इसका सामना करने का समय है। –

    उत्तर

    1

    धन्यवाद। डेटा रीसेट करने के लिए यहां एक और अधिक कार्यात्मक दृष्टिकोण है।

    // reset the filter for a dimension 
    function resetDimensionFilter (dimension) { 
        dimension.filter(null); 
    } 
    
    // reset filters for all given dimensions, 
    // remove all data from index and 
    // return empty index 
    function resetData(ndx, dimensions) { 
        // Clear all filters from dimensions, because `ndx.remove` 
        // only removes records matching the current filters. 
        dimensions.forEach(resetDimensionFilter); 
    
        // Remove all data from the cross filter 
        ndx.remove(); 
    } 
    
    +0

    वाह! यह तो बहुत अच्छी खबर है। क्या आप जिथब फिक्स/इश्यू/पीआर से लिंक कर सकते हैं जो इसे संबोधित करता है? – LondonRob

    +0

    सुनिश्चित नहीं है कि आपका क्या मतलब है। मैं बस रीसेट करने के लिए बस थोड़ा सा कोड लिखता हूं। –

    +0

    ओह। तो क्या है 'लंदनबोर के जवाब के लिए धन्यवाद अब सभी डेटा इंडेक्स से हटा दिया गया है' का संदर्भ लें? मैं उलझन में हूं ... – LondonRob

    3

    यहां मैंने हैकिंग को समाप्त कर दिया है। यह पूरी तरह से अच्छी तरह से काम करता है, हालांकि मुझे यकीन है कि यह ludicrously अक्षम है, क्योंकि सभी आयामों खरोंच से बनाया जा करने के लिए है: @ londonrob के जवाब सभी डेटा अब सूचकांक से निकाल दिए जाने

    var _xfilter = crossfilter({x:1, y:2},{x:3, y:4}), 
        _dimensions = []; 
    
    _dimensions.push(_xfilter.dimension(function(d) { return d.x; }); 
    
    // Unfilters all the given dimensions, removes all data 
    // from xf and adds newData to xf. 
    var _xfilter_reset = function(xf, dimensions, newData) { 
        var i; 
        for (i = 0; i < dimensions.length; i++) { 
         // Clear all filters from this dimension. 
         // Necessary because xf.remove only removes records 
         // matching the current filter. 
         dimensions[i].filter(null); 
        } 
        xf.remove(); // Remove all data from the crossfilter 
        xf.add(newData); 
        return xf; 
    } 
    
    // Resets the global crossfilter object and reapplies all 
    // current dc.js chart filters. 
    var _refresh_data = function(data) { 
        var i, j, 
         chart, oldFilters, 
         allCharts = dc.chartRegistry.list(); 
    
        _xfilter = _xfilter_reset(_xfilter, _dimensions, data);  
    
        // Reset all filters using dc.js 
        for (i = 0; i < allCharts.length; i++) { 
         chart = allCharts[i]; 
         oldFilters = chart.filters(); // Get current filters 
         chart.filter(null); // Reset all filters on current chart 
         for (j = 0; j < oldFilters.length; j++) { 
          // Set all the oldFilters back onto the chart 
          chart.filter(oldFilters[j]); 
         } 
        } 
        dc.redrawAll(); 
    } 
    
    +1

    मुझे लगता है कि यह अब हमारे पास सबसे अच्छा हो सकता है - सभी समूहों और कटौती को फिर भी गणना की जानी चाहिए। जब आप कोई डेटा नहीं रखते हैं तो आप फिल्टर को पुनर्निर्माण करने का प्रयास कर सकते हैं ताकि क्रॉसफिल्टर इंडेक्स को शफल नहीं कर रहा है और प्रत्येक 'फ़िल्टर' कॉल के लिए कटौती नहीं कर रहा है। या हम उपरोक्त उल्लेख @Ethan सुविधा के लिए उम्मीद कर सकते हैं। – Gordon

    संबंधित मुद्दे