2013-02-06 20 views
5

मैं एक्स, वाई, और जेड मानों के साथ कुछ डेटा से स्कैटर प्लॉट बनाने की कोशिश कर रहा हूं।एनवीडी 3 जावास्क्रिप्ट: स्कैटर प्लॉट में अंक में रंग जोड़ें

मेरा कोड एनवीडी 3 वेबसाइट, http://nvd3.org/ghpages/scatter.html पर उदाहरण के समान है, सिवाय इसके कि मैं एक z मान की गणना भी करता हूं। आइए z = x + y कहें। त्रिज्या के मूल्य को बदलने के बजाय, मैं दो रंगों के बीच इंटरपोलिंग करके रंग सेट करना चाहता हूं।

सभी बिंदु चार्ट पर प्रदर्शित होते हैं, लेकिन मैं यह नहीं समझ सकता कि अलग-अलग बिंदुओं के लिए रंग कैसे सेट करें, केवल श्रृंखला के लिए। सरलता के लिए, मैं पहली बार इस तरह एक स्थिर रंग करने के लिए अंक की स्थापना की कोशिश की:

[{"key":"X Plus Y","values":[{"x":0,"y":0,"z":0,"color":"#ff0000"}, ...] 

लेकिन यह काम नहीं करता है, तो मुझे लगता है मैं जावास्क्रिप्ट में ऐसा करने की जरूरत है। मैंने scatterChart.js में एक नज़र डाली लेकिन एक आसान तरीका नहीं देखा। लेकिन मैं किसी भी तरह से जावास्क्रिप्ट विशेषज्ञ नहीं हूं इसलिए मैंने आसानी से कुछ याद किया होगा।

यह कैसे करें इस पर कोई सलाह है? क्या मुझे एक नई मॉडल फ़ाइल बनाने का तरीका सीखना है?

मैं भी एक टूल टिप में जेड मूल्य प्रदर्शित करना चाहते हैं, लेकिन वह कदम 2.

धन्यवाद

उत्तर

5

मैं सिर्फ एक ही मुद्दे में समाप्त हो गया है हो सकता है और एक समाधान है कि मेरे उपयोग फिट बैठता है पाया जाएगा मामला - वाईएमएमवी।

मूल रूप से, मेरी समझ (एनवीडी 3 के स्रोत कोड से) यह है कि आप वास्तव में केवल अलग-अलग बिंदुओं के लिए श्रृंखला के लिए रंग सेट कर सकते हैं: इसलिए मैं आपके उदाहरण में वैसे भी मूल्य वस्तुओं पर color: '#rrggbb' आइटम जोड़ता हूं (सिर्फ इसलिए कि मेरे लिए डेटा संरचना बनाना आसान है), फिर प्रत्येक श्रृंखला का रंग मान इस से सेट करें (मैं underscore.js का उपयोग कर रहा हूं लेकिन आपको इसे शुद्ध जावास्क्रिप्ट में करने में सक्षम होना चाहिए):

final_groups = _.map(groups, function(values, group_id) { 
    return { key: group_id, color: values[0].color, values: values }; 
}); 

यदि आपको बिंदुओं के आधार पर या एक अलग पैमाने का उपयोग करने के बजाय रंगीन निरंतर उपयोग करने की आवश्यकता है, तो मैंने mbostock's advice from this answer का उपयोग किया ताकि डी 3 मेरे लिए रंग मूल्य उत्पन्न कर सके:

function compute_color_on_linear_scale(data, value, colorProperty, colorRange) { 
    // get a list of all the groups (this works if the colorProperty, 
    // aka z in your case, is numeric, otherwise the sort function 
    // needs to be adjusted accordingly) 
    // In your case, you could just write item.z rather than item[colorProperty] 
    // if your function doesn't need to be generic, and in that case you can 
    // omit the colorProperty argument from the argument list altogether 
    categories = _.uniq(_.map(data, function(item) { 
     return item[colorProperty]; 
    }).sort(function(a,b){return a - b}), true); 

    // if no color range was provided, set a default one 
    if(typeof colorRange === 'undefined') { colorRange = ['red', 'green']; } 

    // this is mbostock's magic enchantment from his reply linked above 
    var color = d3.scale.ordinal() 
     .domain(categories) 
     .range(d3.range(categories.length).map(d3.scale.linear() 
     .domain([0, categories.length - 1]) 
     .range(colorRange) 
     .interpolate(d3.interpolateLab))); 

    return color(value); 
} 

यह चाल चलाना चाहिए। मेरा अंतिम स्पर्श पौराणिक कथाओं को छिपाना था क्योंकि इस मामले में ज्यादा समझ नहीं आएगी।

टूलटिप में जेड मान प्रदर्शित करने के लिए, आपको scatterChart() के डिफ़ॉल्ट टूलटिपकंटेंट() फ़ंक्शन को ओवरराइड करने की आवश्यकता है, उदा।

var chart = nv.models.scatterChart() 
    .showDistX(true) 
    .showDistY(true) 
    .tooltipContent(function(key, x, y, obj) { 
     return '<h3>' + obj.point.label + ' (' + key + ')</h3>'; 
    }); 

आप जरूरत के मुताबिक इस रूप में ज्यादा अनुकूलित कर सकते हैं - अगर आप सिर्फ समारोह की शुरुआत में console.log(arguments); जोड़ने के लिए, आप अपने ब्राउज़र के डेवलपर्स उपकरण में निरीक्षण कर सकते हैं कि वास्तव में कौन डेटा उपलब्ध है आप अपने टूलटिप्स में उपयोग करने के लिए के लिए:

[...] 
.tooltipContent(function(key, x, y, obj) { 
    console.log(arguments); 
    return '<h3>' + obj.point.label + ' (' + key + ')</h3>'; 
}); 
1

स्कैटर चार्ट में बुलबुले के लिए रंग विशेषता जोड़ने के लिए, हम getColor accessor को getvize जैसे nv.models.scatter में जोड़ सकते हैं।

, getSize  = function(d) { return d.size || 1} // accessor to get the point size 
, getColor  = function(d) { 
       var colors = ["red", "orange", "yellow", "green", "blue"]; 
       return colors[d.color] || 'red'} // accessor to get the point color 

आप का उपयोग "भरने" विशेषता जहां चक्र चित्रित है रंग जोड़ सकते हैं

//Info:May be on Mousehover?? 
points.enter().append('circle') 
    .attr('cx', function(d,i) { return x0(getX(d,i)) }) 
    .attr('cy', function(d,i) { return y0(getY(d,i)) }) 
    .attr('r', function(d,i) { return Math.sqrt(z(getSize(d,i))/Math.PI) }) 
    .attr('fill', function(d,i) { return getColor(d,i)}); 
संबंधित मुद्दे