Javascript d3多圆系列数据表
这将如何调整以叠加第二组圆Javascript d3多圆系列数据表,javascript,d3.js,Javascript,D3.js,这将如何调整以叠加第二组圆 var data = [{ "name": "Twitter", "items": [{ "value": 2000 }, { "value": 3000 }] }, { "name": "Facebook", "items": [{ "value": 200 }, { "value": 300 }] }, { "name": "Ebay
var data = [{
"name": "Twitter",
"items": [{
"value": 2000
}, {
"value": 3000
}]
}, {
"name": "Facebook",
"items": [{
"value": 200
}, {
"value": 300
}]
}, {
"name": "Ebay",
"items": [{
"value": 1000
}, {
"value": 2000
}]
}, {
"name": "Foursquare",
"items": [{
"value": 2000
}, {
"value": 3000
}]
}]
通过添加其他数据集的选项(目标是创建一个二维金字塔排序,用不同颜色的圆圈表示不同的数据集),以最大的数据集为基准圆
最终甚至可能在不同的数据集之间切换,以始终放置最大的圆作为背景。就这样
其中大部分只是在绘制数据之前对数据进行组织。在每个系列中,给每个项目一个索引,然后按值排序。index属性将告诉我们序列中每个项目的初始位置。每个系列中的第一项现在将是最大的价值。使用此选项可为每个系列构建偏移,并将所有这些偏移相加以生成定位比例 然后为每个系列创建组元素,使用我们计算的偏移量进行定位 在每组中,绘制圆元素。既然我们把它们分类了,它们将首先被抽取出来。.index属性可用于按其在系列中的原始位置着色
米格拉汉姆的回答很好!但因为我已经写了这篇文章,然后不得不去参加一个会议,所以我将如何编写它: $document.readyfunction{ 变量el=$'.seriescart'; var w=el.datawidth; var h=el.dataheight; var保证金={ 排名:65, 右:90,, 底部:5, 左:150 }; var svg=d3.selectel[0]。appendsvg .类别、系列 .attrwidth,w+边距。左+边距。右 .attr高度,h+页边距.top+页边距.bottom .附录 .attransform,translate+margin.left+,+margin.top+; 风险值数据=[{ 名称:推特, 项目:[{ 价值:2000 }, { 价值:3000 }] }, { 姓名:Facebook, 项目:[{ 价值:300 }, { 价值:200 }] }, { 名称:易趣, 项目:[{ 价值:1000 }, { 价值:2000 }] }, { 名称:Foursquare, 项目:[{ 价值:2000 }, { 价值:3000 }] }] //按大小降序排列数组中的项目 //这将有助于我们先画大一点的 //引入颜色分配索引 data.foreachd函数{ d、 项目1、1、1{ d1.id=i; } d、 items.SortFunction x,y{ 返回d3.downingx.value,y.value; }; }; 圆圈制造者; 函数环路生成器{ var colors=d3.scale.category10; 变量计数器=0, prevR=0; svg.selectAllg .数据 进来 .附录 .selectAllcircle .datafunctiond{ 归还d.物品; } 进来 A.附加圆 .自然减员,60 .attrcx,函数,i{ d、 r=数学sqrtd.value; 如果i==0{ 计数器+=上一个计数器+d.r; prevR=d.r; } 返回计数器; } .attrr,已运行{ 返回d.r; } .stylefill,函数{ 返回colorsd.id; }; } }; 身体{ 背景:EEEE; }
第二组圆是items数组中的第二个值吗?当然-{name:Twitter,items:[{value:2000},{value:3000}想法是-如果我们添加了第三组-然后显示3个圆,但以最大的圆为基础,然后将其构建为2D金字塔。这是您应该在问题中包含的重要信息。我添加了一个系列id-因此我的意思是,这将有助于确保圆正确绘制,这基本上是@mgraham和我所做的。我们只是用一个.forEach动态地做了一下……我明白了——下一步可能是添加标签——我很想开始在上面添加指针/标签——事实上,我做了一个省略,我做了一个位置刻度,但后来没有使用它……现在修复了——系列id——jsfiddle.net/0ht35rpb/4——如何确保有一个系列id——以确保数据集不会被删除我明白了,下一步可能是添加标签,希望开始在上面添加指针/标签,对标签有什么建议吗?
function circleMaker() {
var counter = 0;
series = 0
var set = svg.append("g")
.attr("class", "series" + series);
set.selectAll("circle")
.data(data)
.enter().append("circle")
.attr("class", "series" + series)
.attr("cy", 60)
.attr("cx", function(d, i) {
if (i) {
return (counter += Math.sqrt(data[i - 1].items[series].value) + Math.sqrt(data[i].items[series].value));
} else {
return counter;
}
})
.attr("fill", function(d, i) {
var colorArray = ["#00ccff", "#fcdd0a"];
return colorArray[series];
})
.attr("r", function(d) {
return Math.sqrt(d.items[series].value);
});
}
var width = 600;
var height = 400;
var svg = d3.select('svg').attr("width", width).attr("height",height);
var data = [{
"name": "Twitter",
"items": [{
"value": 2000
}, {
"value": 3000
}]
}, {
"name": "Facebook",
"items": [{
"value": 200
}, {
"value": 300
}]
}, {
"name": "Ebay",
"items": [{
"value": 2000
}, {
"value": 1000
}]
}, {
"name": "Foursquare",
"items": [{
"value": 2000
}, {
"value": 3000
},
{
"value": 4000
}]
}];
// organise the data.
// Insert indices and sort items in each series
// keep a running total of max circle size in each series
// for later positioning
var x = 0;
var totalWidth = d3.sum (
data.map (function (series) {
series.items.forEach (function (item, i) {
item.index = i;
});
series.items.sort (function (a, b) {
return b.value - a.value;
});
var maxr = Math.sqrt(series.items[0].value);
x += maxr;
series.xcentre = x;
x += maxr;
return maxr * 2;
})
);
// make scales for position and colour
var scale = d3.scale.linear().domain([0,totalWidth]).range([0, width]);
var colScale = d3.scale.category10();
// add a group per series, position the group according to the values and position scale we calculated above
var groups = svg.selectAll("g").data(data);
groups.enter().append("g");
groups.attr("transform", function(d) {
return ("translate("+scale(d.xcentre)+",0)");
});
// then add circles per series, biggest first as items are sorted
// colour according to index (the property we inserted previously so we can
// keep track of their original position in the series)
var circles = groups.selectAll("circle").data(function(d) { return d.items;}, function(d) { return d.index; });
circles.enter().append("circle").attr("cy", height/2).attr("cx",0);
circles
.attr("r", function(d) { return scale(Math.sqrt (d.value)); })
.style ("fill", function (d) { return colScale(d.index); });