带有鱼眼的D3树图

时间:2014-03-31 17:04:06

标签: javascript performance d3.js treemap fisheye

我有一个由树图可视化的大型数据集。我面临两个问题:

  1. localhost上的加载和显示时间非常慢。预计ajax调用的性能会更差。我的数据集是400个父母,每个父母大约有10-15个孩子。父母只有孩子(孩子没有孩子)

  2. 因为顶层有400个父母,所以初始树图非常拥挤。我想要实现的是fisheye功能。但是,我的下面的代码不起作用,这意味着当我将鼠标移到树形图上时,我看不到鱼眼。我看到鼠标x-y正确输出到控制台。但不是图像。

  3. var 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)");'
    
      d3.json("../data/flare.json", function(data) {
    
      node = root = data;
    
      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 - 1; })
          .style("fill", function(d) { return color(d.parent.name); });
    
      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; })
          .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);
      });
    
      var xFisheye = d3.fisheye.scale(d3.scale.identity).domain([0, w]).focus(360),
      yFisheye = d3.fisheye.scale(d3.scale.identity).domain([0, h]).focus(90);
    
      svg.on("mousemove", function() {
            var mouse = d3.mouse(this);
            xFisheye.focus(mouse[0]);
            yFisheye.focus(mouse[1]);
            redraw();
          });
    
          function redraw() {
              cell.attr("x1", xFisheye).attr("x2", xFisheye);
              cell.attr("y1", xFisheye).attr("y2", xFisheye);
          }       
    });
    

0 个答案:

没有答案