我正在尝试使用d3 v4创建强制有向图。
我能够创建顶点和边,但无法在顶点形状中添加名称/文字。
对于边缘,文本的长度应该在行的上方。
以下代码是添加文字但不是正确的位置
node.append("text").
attr("dx", 6).attr("dy", ".35em")
.style("font-size",10).text(function(d) { return d.name });
答案 0 :(得分:0)
现在你可以
了<强>解释强>
首先创建一组节点和链接
您创建变量节点按
附加数据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}
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;