我正在创建bubble chart fortune 500个here数据。我试图减少选择,但无法弄清楚为什么它没有像我期望的那样工作。
var bubble = d3.layout.pack()
...
d3.json("js/data/fortune2009.json", function(json) {
var node = svg.data([json]).selectAll("g.node")
.data(bubble.nodes); // filter here?
node.enter()
.append("g")
.attr("class", "node")
.attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; });
node.append("circle")
.attr("r", function(d) { return d.r; })
.attr("class", function(d) { return "q" + color(d.Profit) + "-9"; });
node.filter(function(d) { return !d.children; })
.append("text")
.attr("dy", ".3em")
.style("text-anchor", "middle")
.text(function(d) { return d.Company.substring(0, d.r / 3); });
});
JSON数据如下所示:
{
"children":[
{
"Year" : "2009",
"Rank" : "1",
"Revenue" : "442",
"Profit" : "851.00",
"Company" : "Exxon Mobil"
},
....
}
我想删除父节点。我试图使用像http://jsfiddle.net/B9w4N/8/描述的过滤函数。
.filter(function(d) { return !d.children; })
但是,如果我在初始化node
选择的地方添加我的过滤器功能,则不会发生任何事情或我收到错误。
(当我在附加文字之前应用它时,过滤器有效)
我该如何解决这个问题?
更新:这是一个显示我问题的JSFIDDLE {{3}}。
答案 0 :(得分:5)
你有正确的想法。您只需要在创建圆圈的位置应用过滤器(除了创建文本的位置):
node
.filter(function(d) { return !d.children; })
.append("circle")
.attr("r", function(d) { return d.r; });
上的分叉版本
答案 1 :(得分:3)
您可以过滤布局输出的数组:
var node = svg.data([fortune2009]).selectAll("g.node")
.data(function(d) {
return bubble.nodes(d).filter(function(v) {
return v.depth > 0;
});
});
请参阅更新的小提琴:http://jsfiddle.net/B9w4N/10/