मैं इस तरह एक डेटा संरचना है साथ नेस्टेड डेटा (मान लेते हैं कि डेटा संरचना गैर परक्राम्य है):का मेल जनक और d3.js
data = {
segments : [
{x : 20, size : 10, colors : ['#ff0000','#00ff00']},
{x : 40, size : 20, colors : ['#0000ff','#000000']}
]};
d3.js जावास्क्रिप्ट पुस्तकालय का उपयोग करना, मैं चाहूँगा चार आयतों को आकर्षित करने के लिए, colors
सरणी में प्रत्येक रंग के लिए एक। segments
सरणी में प्रत्येक प्रविष्टि से जानकारी का उपयोग color
सरणी में प्रत्येक रंग से संबंधित आयतों को आकर्षित करने के लिए किया जाता है। उदाहरण के लिए, लाल और हरे रंग आयतों चौड़ाई और 10 की ऊंचाई जिसके परिणामस्वरूप एचटीएमएल इस तरह दिखना चाहिए होगा:
<div id="container">
<svg width="200" height="200">
<g>
<rect x="20" y="20" width="10" height="10" fill="#ff0000"></rect>
<rect x="30" y="30" width="10" height="10" fill="#00ff00"></rect>
</g>
<g>
<rect x="40" y="40" width="20" height="20" fill="#0000ff"></rect>
<rect x="60" y="60" width="20" height="20" fill="#000000"></rect>
</g>
</svg>
</div>
मैं कुछ कोड है कि पूरा करता है के साथ आ गया है, लेकिन मैं का उपयोग कर के बारे में हिस्सा मिला भ्रमित होने के लिए data
में घोंसले के दो अलग-अलग स्तरों से डेटा, और मुझे लगता है कि d3.js. के साथ इसे पूरा करने के लिए एक और बेवकूफ तरीका हो सकता है। यहाँ कोड (http://jsbin.com/welcome/39650/edit पर पूर्ण उदाहरण) है:
function pos(d,i) { return d.x + (i * d.size); } // rect position
function size(d,i) { return d.size; } // rect size
function f(d,i) { return d.color; } // rect color
// add the top-level svg element and size it
vis = d3
.select('#container')
.append('svg')
.attr('width',200)
.attr('height',200);
// add the nested svg elements
var nested = vis
.selectAll('g')
.data(data.segments)
.enter()
.append('g');
// Add a rectangle for each color
nested
.selectAll('rect')
.data(function(d) {
// **** ATTENTION ****
// Is there a more idiomatic, d3-ish way to approach this?
var expanded = [];
for(var i = 0; i < d.colors.length; i++) {
expanded.push({
color : d.colors[i],
x : d.x
size : d.size });
}
return expanded;
})
.enter()
.append('rect')
.attr('x',pos)
.attr('y',pos)
.attr('width',size)
.attr('height',size)
.attr('fill',f);
वहाँ d3.js का उपयोग कर एक डेटा संरचना में घोंसले के दो विभिन्न स्तरों से डेटा का उपयोग करने के लिए एक बेहतर और/या अधिक मुहावरेदार रास्ता नहीं है?
संपादित
यहाँ बंद विचार के लिए समाधान मैं के साथ आया था, meetamit's answer करने के लिए धन्यवाद है, और nautat's answer के लिए और अधिक मुहावरेदार d3.js खरोज धन्यवाद का उपयोग कर:
$(function() {
var
vis = null,
width = 200,
height = 200,
data = {
segments : [
{x : 20, y : 0, size : 10, colors : ['#ff0000','#00ff00']},
{x : 40, y : 0, size : 20, colors : ['#0000ff','#000000']}
]
};
// set the color
function f(d,i) {return d;}
// set the position
function pos(segment) {
return function(d,i) {
return segment.x + (i * segment.size);
};
}
// set the size
function size(segment) {
return function() {
return segment.size;
};
}
// add the top-level svg element and size it
vis = d3.select('#container').append('svg')
.attr('width',width)
.attr('height',height);
// add the nested svg elements
var nested = vis
.selectAll('g')
.data(data.segments)
.enter().append('g');
// Add a rectangle for each color. Size of rectangles is determined
// by the "parent" data object.
nested
.each(function(segment, i) {
var
ps = pos(segment),
sz = size(segment);
var colors = d3.select(this)
.selectAll('rect')
.data(segment.colors)
.enter().append('rect')
.attr('x', ps)
.attr('y',ps)
.attr('width', sz)
.attr('height',sz)
.attr('fill', f);
});
});
यहाँ पूर्ण काम कर उदाहरण दिया गया है : http://jsbin.com/welcome/42885/edit
आपको अपने एचटीएमएल कोड में नेस्टेड एसवीजी टैग क्यों चाहिए? – btel
मैं एक साथ 'समूह' के अनुरूप सभी आयतों को एक साथ समूहीकृत करना चाहता हूं। अगर मैं सही ढंग से समझता हूं, तो मैं माता-पिता 'svg' तत्व के 'x' और' y' गुणों को बदलकर सभी आयतों को पहले' सेगमेंट 'से स्थानांतरित कर सकता हूं। यदि कोई बेहतर तरीका है, तो मुझे इसके बारे में जानना अच्छा लगेगा। –
ट्रांसफॉर्म विशेषता के साथ समूह तत्व के बारे में: ' ... ': http://www.w3.org/TR/SVG/coords.html#TransformAttribute। अगर मैं सही ढंग से समझता हूं तो आपके पास प्रत्येक ड्राइंग के लिए केवल एक svg होना चाहिए। –
btel