2

我正在尝试修改 d3 sankey 图表的宽度,因此我可以将扩展内容(有关节点的详细信息)放入调整大小创建的空间中。所以用户点击节点,图表缩小到它的一半宽度,我可以将内容附加到新空间......

问题是,d3 sankey 布局会影响许多其他元素,我不确定如何使 sankey 更改渗透到所有元素中。

定义布局后:

var sankey = d3.sankey()
    .nodeWidth(15)
    .nodePadding(10)
    .size([width, height]);

然后根据数据构建布局

sankey
    .nodes(data.nodes)
    .links(data.links)
    .layout(32); 

我试图通过更新布局

d3.selectAll(".node")
    .on("click",function(d){
        sankey.size([width/2, height])
    })

这显然是行不通的。不知道如何将其推回元素!

Plunker 展示全图:http ://plnkr.co/edit/udEOog?p=preview

4

1 回答 1

1

这比我想象的要简单... sankey布局函数只是定义了事物的大小和位置,因此需要调用来确定更改,然后我只需要根据节点和链接属性重新定义桑基结果。

(更新plunker:http ://plnkr.co/edit/ICyqJk?p=preview )

d3.selectAll(".node")
    .on("click",function(d){
      var newwidth;
      if (this.className.baseVal.indexOf("shift")>=0){
        newwidth = width;
        d3.selectAll(".node")
          .classed("shift",false)
      } else {
        newwidth = width*.5;
        d3.selectAll(".node")
          .classed("shift",true)
      }
      sankey
        .size([newwidth, height])
        .layout(32)
      link
        .transition()
        .attr("d", path)
      node
        .transition()
        .attr("transform", function(d) {
          return "translate(" + d.x + "," + d.y + ")";
        })
    })
于 2014-08-29T08:50:22.267 回答