d3强制布局图标签和顶点和边缘上的文字

时间:2017-09-19 10:27:38

标签: javascript d3.js canvas svg graph

我正在尝试使用d3 v4创建强制有向图。

我能够创建顶点和边,但无法在顶点形状中添加名称/文字。

对于边缘,文本的长度应该在行的上方。

以下代码是添加文字但不是正确的位置

node.append("text").
attr("dx", 6).attr("dy", ".35em")
.style("font-size",10).text(function(d) { return d.name });

JSFIDDLE

enter image description here

1 个答案:

答案 0 :(得分:0)

现在你可以

<强>解释

首先创建一组节点和链接

  1. 节点是持有圈子的组
  2. link是保持线路连接的组
  3. 您创建变量节点按

    附加数据
    node = node.data(nodes, function(d) { return d.id;});
    //var node pointing to group cos still node = g.append("g")
    

    比更新变量节点以附加圆圈

    node = node.enter().append("circle")
    //var node pointing to circle on group
    

    如果您通过

    制作文字
    node.append("text").
    attr("dx", 6).attr("dy", ".35em")
    .style("font-size",10).text(function(d) { return d.name });
    
      

    检查HTML

    它将附加在node>circle>text上,这是错误的 正确的应该是node>text

      

    所以在节点组上创建不在圈子中的文本

    在指向圆的节点变量之前创建要附加在组

    上的变量文本
     uu = node.enter().append("text")
    

    更新x and y位置,例如更新

    上的圈子cx and cy
    function ticked() {//update x and y of uu variable}
    

    &#13;
    &#13;
    var createD3 = function(){
    		var svg = d3.select("svg"),
    		    width = +svg.attr("width"),
    		    height = +svg.attr("height"),
    		    color = d3.scaleOrdinal(d3.schemeCategory10);
    
    		    var a = {id: "a",name:"y"},
    			    b = {id: "b",name:"x"},
    			    c = {id: "c",name:"z"},
    			    nodes = [a, b, c],
    			    links = [{source: a, target: b},{source: b, target: c},{source: c, target: a}];
    
    
    		    var simulation = d3.forceSimulation(nodes)
    			    .force("charge", d3.forceManyBody().strength(-1000))
    			    .force("link", d3.forceLink(links).distance(200))
    			    .force("x", d3.forceX())
    			    .force("y", d3.forceY())
    			    .alphaTarget(1)
    			    .on("tick", ticked);
    
    
    
    		var g = svg.append("g").attr("transform", "translate(" + width / 2 + "," + height / 2 + ")"),
    		    link = g.append("g").attr("stroke", "#000").attr("stroke-width", 1.5).selectAll(".link"),
    		    node = g.append("g").attr("stroke-width", 1.5).selectAll(".node");
    
    		restart();
    
    		function restart() {
    
    		  // Apply the general update pattern to the nodes.
    		  node = node.data(nodes, function(d) { return d.id;});
    		  node.exit().remove();
          uu = node.enter().append("text").text(function(d) { return d.name }).attr("fill",'blue').attr('text-anchor','middle').style('font-size',24)
    		  node = node.enter().append("circle").attr("fill", function(d) { return color(d.id); }).attr("r", 8).merge(node);
    		  		  
      		//var labels = node
    
    		  // Apply the general update pattern to the links.
    		  link = link.data(links, function(d) { return d.source.id + "-" + d.target.id; });
    		  link.exit().remove();
    		  link = link.enter().append("line").merge(link);
    
    		  // Update and restart the simulation.
    		  simulation.nodes(nodes);
    		  simulation.force("link").links(links);
    		  simulation.alpha(1).restart();
    		}
    
    		function ticked() {
    		  node.attr("cx", function(d) { return d.x; })
    		      .attr("cy", function(d) { return d.y; });
    
    			uu.attr("x", function(d,i) { 
           if(i==0){return d.x-80;}
            if(i==1){return d.x+10;}
             if(i==2){return d.x+80;}
    
          })
    		      .attr("y", function(d,i) { 
              if(i==0){return d.y+40;}
               if(i==1){return d.y-80;}
                if(i==2){return d.y+80;}
    
              })
              
              
    		  link.attr("x1", function(d) { return d.source.x; })
    		      .attr("y1", function(d) { return d.source.y; })
    		      .attr("x2", function(d) { return d.target.x; })
    		      .attr("y2", function(d) { return d.target.y; });
    		}
    	};
    		createD3();
    &#13;
    <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/4.2.3/d3.min.js"></script>
    <svg width="500" height="500"></svg>
    &#13;
    &#13;
    &#13;