d3.js将文本从Json追加到矩形

时间:2016-05-24 09:36:19

标签: javascript jquery json d3.js

我想在我使用D3.js(我的图表)1建立的图表中为一些矩形附加一些文字。

这就是我的Json的样子:

     {
    "nodes":
    [
        {
            "type":"projet",
            "data":{
                "id_projet":"50",
                "nom_projet":"abrakadabra"  
                "objet_projet":"",
                "these_projet":"0",
                "resume_projet":"",
                "role_imbe_projet":
                "Partenaire":"",
                "duree_projet":"24",
                "montant_aide_projet":"103000",
                "part_imbe_projet":"33342",
                "cout_total_projet":"0",
                "id_agent":"81",
                "etat_projet":"2",
                "archive_projet":"1",
                "competitivite_projet":"0",
                "previsionnel_projet":"",
                "HM_permanent_projet":"0",
                "HM_CDD_projet":"0",
                "partenaire_projet":"help me please"
                }
    }
...
    ]
   }

这是我的源代码:

function arbre(graph) { // graph is my Json file
        var width = 1000,
            height = 1000,
            wrect=300,
            hrect=400;
        var color = d3.scale.category20();
        var nodes=graph.nodes;
        var root = nodes[0];
        var stx=sty=50; 

        root.fixed = true;
        root.x = 400;
        root.y = 30; 

        //on ajoute les paramètre x2 et y2 au noeud
        for(var key in nodes)
        {
            nodes[key].x2=wrect;
            nodes[key].y2=hrect;
        }

        var force = d3.layout.force()
            //.charge(-200) // -120 200
            //.alpha(0);
            .linkDistance(50) // 20 200
            .gravity(0.5)
            .charge(function(d, i) { return i ? 0 : -2000; })
            .size([width, height]);

         // définition des noeuds et des liens de la force
         force.nodes(nodes)
              .links(graph.links)
              .start();

        var svg = d3.select("#graph") 
            .append("svg")
            .attr("width", width)
            .attr("height", height);


          // création des liens sous forme de lignes
          var link = svg.selectAll(".link")
              .data(graph.links)
              .enter()
              .append("g")                  // groupe pour les links 
              .attr("class","link-group")  
              .append("line")
              .attr("class", "link")
              .style("stroke-width", function(d) { return Math.sqrt(d); });

            // création des nodes sous forme de rectangles
          var node = svg.selectAll(".node")
              .data(nodes)
              .enter()
              .append("g")
              .attr("class","node-group")
              .append("rect")  
              .attr("class", "node")
              .attr("width", wrect) 
              .attr("height", hrect)  
              .style("fill", function(d) { return color(d.data.id_projet); })

              .attr("y", function(d) {if(d.type == 'convention') d.y = 300;})//return 300; })
              .call(force.drag);

            // Ajouter des infos au rectangles 

            var id = svg.selectAll(".node-group")
                    .data(graph.nodes) 
                    .append("text")
                    .text(function(d) {if(d.type == 'projet')return d.data.id_projet; })
                    .attr("font-family", "sans-serif")
                    .attr("font-size", "10px");
         var acronyme = svg.selectAll(".node-group")
                .data(graph.nodes) 
                .append("text")
                .text(function(d) {return d.data.acronyme_projet; })
                .attr("font-family", "sans-serif")
                .attr("font-size", "10px");                 



          // la fonction tick
          force.on("tick", function(e){
              var q = d3.geom.quadtree(nodes),
              i = -1,
              n = nodes.length;

            console.log(nodes);
              // traitement de la collision des rectangles  
              while (++i < n)
              {
                q.visit(collide(nodes[i])); 
              }

            // mise à jour des positions des rectangles et des lignes     
            node.attr("x", function(d) { return d.x; })
              //.attr("y", function(d) { return d.y; });
              .attr("y", function(d) { 
                if(d.type == "projet") return d.y;
                if(d.type == "convention") return 300; 
                if(d.type == "budget") return 600;
              });
            console.log(nodes);
            link.attr("x1", function(d) { return d.source.x+stx; })  // d: data() of links
                .attr("y1", function(d) { return d.source.y+stx; })
                .attr("x2", function(d) { return d.target.x+stx; })
                .attr("y2", function(d) { return d.target.y+stx; });

            // positionnement du text dans les rectangles    
            id.attr("x", function(d) { return d.x+2; }) // d: data() of texte
              .attr("y", function(d) { return d.y+10; });
acronyme.attr("x", function(d) { return d.x+2; }) // d: data() of texte
                .attr("y", function(d) { return d.y+20; });                        
      });

          });

          // to avoid overlapping 
          function overlap(a, b){

             if(((a.x < b.x && b.x < a.x2) && (a.y < b.y && b.y < a.y2)) || ((a.x < b.x2 && b.x2 < a.x2) && (a.y < b.y2 && b.y2 < a.y2)))
             {
                return true;
             }
         }

    //-------------my collision function
        function collide(node) {

                node.x2=node.x+wrect;
                node.y2=node.y+hrect;

          var nx1, nx2, ny1, ny2, padding;
          padding = 20;
          nx1 = node.x - padding;
          nx2 = node.x2 + padding;
          ny1 = node.y - padding;
          ny2 = node.y2 + padding;
        console.log(node.x,node.x2,node.y,node.y2);
        console.log(nx1, nx2, ny1, ny2, padding);

          return function(quad, x1, y1, x2, y2) {
          console.log(quad, x1, y1, x2, y2);
          var dx, dy;
          if (quad.point && (quad.point !== node)) {
          if (overlap(node, quad.point)) {

            console.log(node.x2,quad.point.x, quad.point.x2, node.x);
            console.log(node.x2-quad.point.x, quad.point.x2 - node.x);
            dx = Math.min(node.x2 - quad.point.x, quad.point.x2 - node.x) / 2;
            node.x -= dx;
            quad.point.x += dx;
            dy = Math.min(node.y2 - quad.point.y, quad.point.y2 - node.y) / 2;
            node.y -= dy;
            quad.point.y += dy;
          }
        }
        return x1 > nx2 || x2 < nx1 || y1 > ny2 || y2 < ny1;
      };
    };
}

在这段代码中,我可以轻松地使用“text”属性从我的Json获取数据。但我的问题是我不知道如何将我的Json的“数据”字段中的所有数据附加到矩形。我想说的是,有可能使用for循环或类似的东西来做,而不是每次我想要附加某些内容时都不使用“text”属性。

提前谢谢

0 个答案:

没有答案