动态更新d3.js树形图

时间:2014-07-09 14:07:35

标签: javascript dynamic d3.js treemap

我正在尝试在数据更新时动态更新我的d3树形图。我有两个函数,一个是我最初调用构建树图,另一个是重绘树图。当我重绘树形图时,我在树形图的顶部得到一个细黑条,并且我正在绘制的数组中的第一个元素变黑。如果我点击两个黑色元素中的任何一个。我收到了错误......

Uncaught TypeError: Cannot read property 'dx' of undefined 

因此传递给单元格的数据未定义。

此外,当我调用regraph时,我已检查并且数据已更改,但图形与我最初构建树形图时的情况相同,但两个黑色元素除外。

构建树形图的代码如下。此外,createObj函数接受两个数组并创建一个Json对象。

 function drawTreeMap(array1,array2){
        console.log("got to drawing");
        nestedJson=createObj(array1, array2);
            w = 1880 - 80,
            h = 900 - 180,
            x = d3.scale.linear().range([0, w]),
            y = d3.scale.linear().range([0, h]),
            color = d3.scale.linear()
                .range(['lightgreen', 'darkgreen']) // or use hex values
                .domain([computeMin(array2), computeMaxNum(array2)]);
            root,
            node;


            treemap = d3.layout.treemap()
                .round(false)
                .size([w, h])
                .sticky(true)
                .padding([10, 0, 0, 0])
                .value(function(d) { return d.size; });

            svg = d3.select("#body").append("div")
                .attr("class", "chart")
                .style("width", w + "px")
                .style("height", h + "px")
              .append("svg:svg")
                .attr("width", w)
                .attr("height", h)
              .append("svg:g")
                .attr("transform", "translate(.5,.5)");


              node = root = nestedJson;

              var nodes = treemap.nodes(root)
                  .filter(function(d) { return !d.children; });

              var cell = svg.selectAll("g")
                  .data(nodes)
                  .enter().append("svg:g")
                  .attr("class", "cell")
                  .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
                  .on("click", function(d) { return zoom(node == d.parent ? root : d.parent); });

              cell.append("svg:rect")
                  .attr("width", function(d) { return d.dx - 1; })
                  .attr("height", function(d) { return d.dy ; })
                  .style("fill", function(d) { return color(d.size)});

              cell.append("svg:text")
                  .attr("x", function(d) { return d.dx / 2; })
                  .attr("y", function(d) { return d.dy / 2; })
                  .attr("dy", ".35em")
                  .attr("text-anchor", "middle")
                  .text(function(d) { return (d.name+",--  "+d.size); })
                  .style("opacity", function(d) { d.w = this.getComputedTextLength(); return d.dx > d.w ? 1 : 0; });




              d3.select(window).on("click", function() { zoom(root); });

              d3.select("select").on("change", function() {
                treemap.value(this.value == "size" ? size : count).nodes(root);
                zoom(node);
              });

    }

重绘的代码如下。

function redrawGraphFromJson(data) {
      treemap = d3.layout.treemap()
        .round(false)
        .size([w,h])
        .value(function(d) { return d.size; })
        .sticky(true);

      // Draw the graph
      node = root = data;
      var nodes = treemap.nodes(root)
                  .filter(function(d) { return !d.children; });

      var cell = svg.selectAll("g")
        .data(nodes)
        .attr("class", "cell")
        .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; })
        .on("click", function(d) { return zoom(node == d.parent ? root : d.parent); });

    cell.append("svg:rect")
        .attr("width", function(d) { return d.dx - 1; })
        .attr("height", function(d) { return d.dy ; })
        .style("fill", function(d) { return color(d.size);});

    cell.append("svg:text")
        .attr("x", function(d) { return d.dx / 2; })
        .attr("y", function(d) { return d.dy / 2; })
        .attr("dy", ".35em")
        .attr("text-anchor", "middle")
        .text(function(d) { return (d.name+",--  "+d.size); })
        .style("opacity", function(d) { d.w = this.getComputedTextLength(); return d.dx > d.w ? 1 : 0; });

  }

谢谢。

1 个答案:

答案 0 :(得分:1)

在重新绘制图形时,您需要在初始图形上使用.exit(),然后在.enter()中使用新数据更新组。这将用新的替换旧地图。

http://bost.ocks.org/mike/join/完美地解释了它并且有一个非常好的例子可以看。