9

Google द्वारा विज़ुअलाइजेशन एपीआई का उपयोग करके समूह का उपयोग करके फ़ॉर्मेटिंग को बनाए रखें, मैं अपने कच्चे डेटा के आधार पर उप-टेबल बनाने के लिए google.visualization.data.group का उपयोग करता हूं। मेरा कच्चा डेटा मूल्य के अलावा कुछ और प्रदर्शित करने के लिए {v: "यूएस", f: "United States"} की चाल का उपयोग करता है, लेकिन जब मैं समेकन फ़ंक्शन का उपयोग करता हूं, तो फ़ॉर्मेटिंग केवल "यूएस" भाग को छोड़कर समाप्त हो जाती है।Google विज़ुअलाइजेशन एपीआई

क्या मूल स्वरूपण को बनाए रखने का कोई तरीका है, या समूह समेकन का उपयोग करके बनाए गए डेटाटेबल्स पर इसे वापस जोड़ने का कोई आसान तरीका है?

नमूना डेटा:

[2010, {v:"MA", f:"Morocco"}, {v:"002", f:"Africa"}, {v:"002", f:"Northern Africa"}, 21.12724], 
[2010, {v:"AW", f:"Aruba"}, {v:"019", f:"Americas "}, {v:"019", f:"Caribbean"}, 0.98], 
[2010, {v:"AF", f:"Afghanistan"}, {v:"142", f:"Asia"}, {v:"142", f:"Southern Asia"}, 0.9861], 
[2010, {v:"AO", f:"Angola"}, {v:"002", f:"Africa"}, {v:"002", f:"Middle Africa"}, 5.11774], 

एकत्रीकरण फंक्शन:

var countryData = google.visualization.data.group(
    rawData, 
    [0, 1], 
    [{'column': 4, 'aggregation': google.visualization.data.sum, 'type': 'number'}] 
); 

संपादित करें:

आगे सोचा, यह शायद असंभव समूह के प्रारूप के साथ के बाद से वहाँ कोई गारंटी नहीं है कि के लिए प्रारूप प्रत्येक मान सुसंगत रहेगा। इसे ध्यान में रखते हुए, यह एक ऐसा फ़ंक्शन लिखने के लिए शायद बेहतर (या केवल संभव) है जो मेरे डेटा के प्रत्येक कॉलम में स्वरूप जोड़ देगा। तो सवाल बन जाता है, "मैं यह कैसे करता हूं?"

मैं वास्तव में अकेले अपरिवर्तित मूल्यों के रूप में अपना कच्चा डेटा नहीं बनाऊंगा, और फिर प्रत्येक मान के लिए प्रारूपों को देखने के लिए अतिरिक्त तालिकाओं का निर्माण नहीं करूंगा। इसके लिए एक अतिरिक्त 2 टेबल (उन क्षेत्रों के लिए एक जो 28 पंक्तियां हैं, एक के लिए 240 पंक्तियों से अधिक देशों के लिए) की आवश्यकता होगी, और उसके बाद समूहित तालिका में प्रत्येक मान को देखने के लिए दो कार्य बनाएंगे (जिसमें 30+ वर्ष का डेटा होगा, अर्थ हजारों लाइनें) मूल्य जोड़ना।

यह वास्तव में एक जटिल समाधान की तरह लगता है।

क्या संशोधक कार्यों के साथ ऐसा करने का कोई तरीका है? क्या मैं तालिका में प्रत्येक मान को {v: "यूएस", एफ: "संयुक्त राज्य"} स्वरूपित ऑब्जेक्ट के रूप में वापस करने के लिए एक फ़ंक्शन लिख सकता हूं? या क्या कॉलम फॉर्मेटर लिखने का एक आसान तरीका है जो मेरी मूल तालिका में उपयुक्त मान को देखेगा और उस प्रारूप को अपनाएगा? जो मेरे लिए कम से कम सिरदर्द का कारण बनता है (जिसे इसे लिखना है), और उपयोगकर्ताओं के लिए (जिन्हें इसे लोड करना है)?

संपादित करें 2:

ऐसा लगता है कि मैं कुछ इस तरह का उपयोग कर नई तालिका के लिए एक फ़ॉर्मेटर बनाने के लिए सक्षम होना चाहिए:

function (dt, row) { 
    return { 
     v: (dt.getValue(row, 1)/1000000), 
     f: (dt.getValue(row, 1)/1000000) + 'M' 
    } 
} 

लेकिन मुद्दा बन जाता है कि जब मैं संख्या के साथ काम नहीं कर रहा हूँ प्रारूप, मुझे कुछ प्रकार की लुकअप टेबल बनाना होगा जो मूल्य लेगा, इसे लुकअप टेबल में देखें, और उसके बाद उपयुक्त प्रारूप वापस करें। ऐसा लगता है कि मुझे पूरी तालिका, पंक्ति से पंक्ति, जो हजारों लाइनों के माध्यम से लूप करना पड़ सकता है।

मैं कल्पना नहीं कर सकता कि कुछ ब्रूट फोर्स लूपिंग और मूल्यों को असाइन किए बिना ऐसा करने का कोई आसान तरीका नहीं है।

संपादित करें 3:

तो मैंने कुछ मुश्किल कोशिश की। प्रत्येक पंक्ति को मान/प्रारूप के रूप में सेट करने के बजाय, मैंने स्ट्रिंग के रूप में मान/प्रारूप भाग बनाया, और उसके बाद ऑब्जेक्ट का मूल्यांकन करने के लिए प्रयुक्त eval() को समूहित करने के बाद। यह बहुत अच्छा काम किया।

[2010, "{v: 'MA', f: 'Morocco'}", 21.13], 
[2010, "{v: 'AW', f: 'Aruba'}", 0.98], 
[2010, "{v: 'AF', f: 'Afghanistan'}", 0.99], 
[2010, "{v: 'AO', f: 'Angola'}", 5.12], 

यहाँ नए कोड है:: यहाँ डेटा है

var countryCount = countryData.getColumnRange(0).count; 

    for (var i = 0; i <= countryCount; i++) { 
    countryData.setValue(i, 1, eval('(' + countryData.getValue(i,1) + ')')); 
    }; 

मुद्दा है कि जब मैं उत्पादन यह एक Google DataTable करने के लिए, यह पता चलता {v: 'एई', च: ' संयुक्त अरब अमीरात '} तथ्य ठीक से eval साथ परिणाम की जाँच के बावजूद मुझे देता है:

>>> eval('(' + countryData.getValue(i,1) + ')') 
Object v="AE" f="United Arab Emirates" 

तो क्या मैं गलत यहाँ कर रहा हूँ?

उत्तर

1

मैं बस इस मुद्दे में खुद भाग गया। मैंने स्वरूपित मानों को ढूंढने के लिए मूल डेटाटेबल के उपयोग से स्वरूपित मान में मान बदलने के लिए एक संशोधक का उपयोग करने का निर्णय लिया। यह बहुत कुशल नहीं है, लेकिन यह काम करता है और कंप्यूटर तेज़ होते हैं।

function getFormatForValue(dataTable, column, value) { 

    // we need to spin through column in the dataTable looking 
    // for the matching value and then return the formatted value 
    var rowcount = dataTable.getNumberOfRows(); 
    for (var i=0; i<rowcount; i++) { 
     if (dataTable.getValue(i, column) === value) { 

      // we found it, this will look much better 
      return dataTable.getFormattedValue(i, column);  
     } 
    } 

    // better than nothing 
    return value; 
} 

फिर उस फोन में संशोधक में, अपने मूल समूह कॉल बदल रहा:

var countryData = google.visualization.data.group(
    rawData, 
    [ 
    { 
     'column': 0, 
     'modifier': function(value) { return getFormatForValue(rawData, 0, value); }, 
     'type': 'string' 
    }, 
    { 
     'column': 1, 
     'modifier': function(value) { return getFormatForValue(rawData, 1, value); }, 
     'type': 'string' 
    } 
    ], 
    [{'column': 4, 'aggregation': google.visualization.data.sum, 'type': 'number'}] 
); 

अद्यतन:

पहले एक देखने समारोह बनाने ऐसा लगता है कि आप मूल्य और स्वरूपित मान की जरूरत है संरक्षित। पाई चार्ट प्रदर्शित करने के मेरे मामले में, मुझे मूल मूल्य को संरक्षित रखने की परवाह नहीं है। मुझे लगता है कि यह आपके लिए काम नहीं करेगा, लेकिन मैं यह जवाब दूसरों के लिए यहां छोड़ दूंगा जो मेरे जैसे सरल मामले में हो सकते हैं।

मैंने इस पर कुछ और मिनट बिताए और यहां एक विकल्प है जो मूल सेल मान रखते हुए स्वरूपित मूल्य की प्रतिलिपि बनायेगा।

function copyFormattedValues(oldDataTable, oldColumn, newDataTable, newColumn) { 

    var rowcount = newDataTable.getNumberOfRows(); 
    for (var i=0; i<rowcount; i++) { 
     var value = newDataTable.getValue(i, newColumn); 
     var formatted = getFormatForValue(oldDataTable, oldColumn, value); 
     newDataTable.setFormattedValue(i, newColumn, formatted); 
    } 

} 

फिर अपने मामले में, यह एक बार प्रत्येक स्तंभ की प्रतिलिपि बनाना चाहते के लिए कॉल:

एक प्रति समारोह देखने समारोह का उपयोग करता है बनाएँ।

copyFormattedValues(rawData, 0, countryData, 0); 
copyFormattedValues(rawData, 1, countryData, 1); 

आपका स्रोत और गंतव्य कॉलम समान हैं लेकिन कुछ मामलों में वे अलग-अलग हो सकते हैं।

बेशक, आदर्श रूप से यह सब स्वचालित रूप से हुआ होगा।

4

ठीक है, मैंने इसे एक बाहर निकाला (यह कितना अप्रिय रूप से जटिल था)।

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

[2010, "'MA'|'Morocco'", 21.13], 
[2010, "'AW'|'Aruba'", 0.98], 
[2010, "'AF'|'Afghanistan'", 0.99], 
[2010, "'AO'|'Angola'", 5.12], 

मैं तो इस का उपयोग स्तंभ 1 के लिए विभक्त स्थान प्राप्त करने के लिए:

function splitFormat(dividerLocation, stringToSplit) { 
    // alert("entered splitFormat Function"); 
    var stringValue = ""; 
    var formatValue = ""; 
    stringValue = stringToSplit.substring(0, dividerLocation); 
    formatValue = stringToSplit.substring(dividerLocation + 1) 
    alert("v: " + stringValue + ", f: " + formatValue); 
    return { 
     v: stringValue, 
     f: formatValue 
    } 
     } 
:

var countryCount = countryData.getNumberOfRows(); 

for (var i = 0; i <= countryCount; i++) { 
    var stringToSplit = countryData.getValue(i,1); 
    var dividerLocation = stringToSplit.indexOf("|"); 
    alert("Divider: " + dividerLocation + ", String: " + stringToSplit); 
    countryData.setValue(i, 1, splitFormat(dividerLocation, stringToSplit)); 
}; 

और फिर मैं इस सुविधा का उपयोग स्ट्रिंग विभाजित करने के लिए

समस्या यह है कि मैं अपने डेटा के कॉलम 1 को 'स्ट्रिंग' के रूप में परिभाषित कर रहा हूं, लेकिन फ़ायरबग मुझे बता रहा है कि splitFormat() फ़ंक्शन से लौटाई गई ऑब्जेक्ट एक ऑब्जेक्ट है (क्योंकि यह एक सरणी है जो मुझे लगता है)। और च:: यहां तक ​​कि अगर मैं av के साथ मूल datatable सेट घटक, यह एक लौटे सरणी वस्तु मान को स्वीकार नहीं करना चाहता है के रूप में FireBug मेरा पीछा ओह-तो-उपयोगी सलाह देता है:

"Error: Type mismatch. Value [object Object] does not match type string in column index 1 (table.I.js,137)" 

मुद्दा यह है कि जब आप {v:, f:} वाक्यविन्यास का उपयोग करके डेटाटेबल को परिभाषित कर सकते हैं, तो आप उस वाक्यविन्यास को तालिका में वापस नहीं कर सकते हैं क्योंकि उस कॉलम के मान को स्ट्रिंग के रूप में सेट किया गया है। इसके बजाय मैं DataTable के "setFormattedValue" संपत्ति का इस्तेमाल किया इस मुद्दे को ठीक करने के लिए:

function drawVisualization() { 
    var countryTable = new google.visualization.Table(document.getElementById('table')); 

    var countryCount = countryData.getNumberOfRows() - 1; 

    for (var i = 0; i <= countryCount; i++) { 
     var stringToSplit = countryData.getValue(i,1); 
     var dividerLocation = stringToSplit.indexOf("|"); 
     var stringValue = stringToSplit.substring(0, dividerLocation); 
     var stringFormat = stringToSplit.substring(dividerLocation + 1); 
     countryData.setValue(i, 1, stringValue); 
     countryData.setFormattedValue(i, 1, stringFormat); 
    }; 

यह ठीक से मुझे दोनों के लिए उपयुक्त मान दिया था, भले ही यह बड़े डेटा सेट के लिए एक सा गहन है। अगर कोई ऐसा करने का आसान तरीका जानता है, तो मुझे यह सुनकर खुशी होगी।

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