【问题标题】:D3js filter selectionD3js 过滤器选择
【发布时间】:2014-06-27 03:35:36
【问题描述】:

我正在创建fortune 500 数据的交互式bubble chart。我正在尝试减少选择,但无法弄清楚为什么它没有按预期工作。

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"
    },
    ....
}

我想删除父节点。我正在尝试使用像here 描述的过滤器功能。

.filter(function(d) { return !d.children; })

但是,如果我在初始化 node 选择的位置添加过滤器函数,则要么什么都没有发生,要么我得到一个错误。

(当我在附加文本之前应用过滤器时,过滤器会起作用)

我该如何解决这个问题?

更新:这是一个 JSFIDDLE http://jsfiddle.net/B9w4N/8/ 显示我的问题。

【问题讨论】:

  • 一目了然,我猜您需要将过滤器放在node.enter().append("g") 之间,但是运行示例所花费的时间比我所花的时间要多因此,如果您可以在 JSFiddle 上进行一些工作,那将会有所帮助...

标签: javascript d3.js filtering circle-pack


【解决方案1】:

你的想法是对的。您只需在创建圆圈的位置应用过滤器(除了创建文本的位置):

node
    .filter(function(d) { return !d.children; })
    .append("circle")
    .attr("r", function(d) { return d.r; });

JSFiddle 上的分叉版本

【讨论】:

  • 谢谢@Richard。我实际上早先尝试过,但感觉不是最佳解决方案,因为创建了<g class="node" transform="translate(300,300)"></g>。我相信如果我早先过滤选择,则可以在创建文本的地方避免过滤器......
  • 当我在节点中有多个子节点并且每个节点我想用节点附加圆圈时该怎么办?
  • @AmitRana 你能发布一个单独的问题吗,这个问题的 cmets 不是一个很好的媒介。如果您回复问题的链接,我很乐意回答。
【解决方案2】:

您可以过滤布局输出的数组:

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/

【讨论】:

  • 谢谢@nautat。它解决了我的问题,但又产生了另一个问题。当我与图表交互时,为什么第一个圆圈表现得很奇怪?
  • 您在交互函数中重新分配数据做了一些有趣的事情。您还想使用关键功能来确保气泡对应于同一家公司,即使在使用数据数组之后也是如此。查看更新的小提琴:jsfiddle.net/B9w4N/11
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2020-07-21
  • 2011-10-27
  • 2011-03-28
  • 1970-01-01
相关资源
最近更新 更多