2017-02-24 10 views
0

次のコードは、最初に別の矩形(クラス "rect_b")を含む< g>要素に対して3つの矩形(クラス "bar_start")+を作成します。更新後(3つの追加のデータセット値)、すべての要素の数が3から6に増加しますが、新しい「bar_start」矩形は<>ノードに連結され、それに応じて転置されます。D3:予期しない親ノードにdom要素を追加

どうしてですか?

var colors = [[66,124,153],[154,61,55],[106,125,57],[129,42,77],[204,94,41],[219,170,53]]; 

      //coordinates 
      var w = 500;       //svg width 
      var h = 200;       //svg height 
      var p = 3;        //svg padding 
      var segment_height = h* 0.2;   //height of bars 
      var label_height = segment_height/2; //legend rect height  
      var label_width = (w - 4 * p)/3;  //legend rect width 
      var s = 3;        //break width between bars 

      //dataset 
      var dataset1 = [{data: 7, attribute: "Project"}, {data: 14, attribute: "Other"}, {data: 95, attribute: "Other2"}]; 

      var dataset2 = [{data: 45, attribute: "Jaja"}, {data: 25, attribute: "Dupa"}, {data: 10, attribute: "Process"}, 
           {data: 7, attribute: "Project"}, {data: 14, attribute: "Other"}, {data: 14, attribute: "Other"}]; 

      var dataIndex; 

      //create svg 
      var svg = d3.select("body") 
       .append("svg") 
       .attr("width",w) 
       .attr("height",h) 
       .attr("y", 100) 
       .style("border", "1px solid black"); 

      function update() { 

       if (dataIndex==1) { 
        dataIndex = 2 
       } else { 
        dataIndex = 1 
       } 

       //debugger; 

       var dataset = []; 
       dataset = eval("dataset" + dataIndex); 

       //debugger; 

       //total length of bars 
       var length_of_segments = w - 2 * p - (dataset.length-1) * s; 

       //find sum of values 
       var sum_of_data = 0; 
       for (var i = 0; i < dataset.length; i++) { 
        sum_of_data = sum_of_data + dataset[i].data 
       }; 

       //set scale 
       var scale = d3.scale.linear() 
        .domain([0, sum_of_data]) 
        .range([0, length_of_segments]); 

       var array = new Array(); 
       array[0] = new Array(); 
       array[1] = new Array(); 

       //set width and x for bars 
       for (var i = 0; i < dataset.length; i++) { 
        //placeholder for width 
        array[0][i] = scale(dataset[i].data); 
        //placeholder for x 
        if (i==0) { 
         array[1][i] = p 
        } else { 
         array[1][i] = array[1][i-1] + array[0][i-1] + s 
        }; 
       }; 

       //bars 
       var label_rect = svg.selectAll("rect") 
        .data(dataset); 

        label_rect 
         .exit() 
         .remove(); 

        label_rect 
         .enter() 
         .append("rect") 
         .attr("x",0) 
         .attr("width", 0); 

        label_rect 
         .transition() 
         .attr("class", "bar_start") 
         .attr("x", function(d,i) { 
          if (i==0) { 
           return p 
          } else { 
           return s + array[0][i-1] + array [1][i-1] 
          }; 
         }) 
         .attr("y", p) 
         .attr("width", function(d,i) { 
          return array[0][i]; 
         }) 
         .attr("height", segment_height) 
         .attr("fill", function(d,i) { 
          return "rgb(" + colors[i][0] + "," + colors[i][1] + "," + colors[i][2] + ")" 
         }) 

        //gs for legend 
        var g = svg.selectAll("g") 
         .data(dataset) 

         g 
         .exit() 
         .remove(); 

         g 
         .enter() 
         .append("g"); 

         g 
         .attr("class", "g_start") 
         .attr("transform", function(d,i) {a=(p + (((i/3)-Math.floor(i/3))*3) * (label_width + p)); 
          return "translate(" 
            + (p + (((i/3)-Math.floor(i/3))*3) * (label_width + p)) + ","               //count x - position in row 
            + (2*p + segment_height + (Math.floor(i/3)) * (label_height+p)) + ")";             //count y - number of row 
          }) 

         g.append("rect") 
          .attr("class", "rect_b") 
          .attr("width", label_width-1) 
          .attr("height", label_height-1) 
          .attr("rx", label_width*0.02) 
          .attr("ry", label_width*0.02) 

      }; 


      d3.select("p").on("click", function() { 
       update(); 
      }); 
+0

* eval *: 'eval(" dataset "+ dataIndex);'を削除する必要があります。 – RobG

+0

これは、データセットを切り替えるだけの方法です。私はそれを変更しました(評価なし)が、同じように動作します... – Zenon

答えて

0

私は2つの "rect"グループを区別しなかっただけでした。個別のIDを持つ個別の<要素に入れて、親ノードへの明示的な参照で動作していれば、すべて正常に動作します。

関連する問題