在力导向图中向d3节点添加文本标签

10
这是我的代码样式,您也可以在JsFiddle上获取完整的代码。 我想在每个节点上都有标签,但我做不到。 顺便说一下,在控制台中,标签可以嵌入圆形内部。
var nodes = svg.selectAll("circle")
                    .data(dataset.nodes)
                    .enter()
                    .append("circle")
                    .attr("r", 10)
                    .style("fill", function(d, i){
                        return colors(i);
                    })
                    .call(force.drag);
    var label = nodes.append("svg:text")
                    .text(function (d) { return d.name; })
                    .style("text-anchor", "middle")
                    .style("fill", "#555")
                    .style("font-family", "Arial")
                    .style("font-size", 12);



    force.on("tick", function(){
        edges.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; });
        nodes.attr("cx", function(d){ return d.x; })
             .attr("cy", function(d){ return d.y; });
        label.attr("x", function(d){ return d.x; })
             .attr("y", function (d) {return d.y - 10; });


    });
1个回答

19

现在,您正在将text元素附加到circle元素上,这样做是行不通的。

当您编写代码时...

var label = nodes.append("svg:text")

您正在将文本附加到nodes选择器上。但是,您必须记住nodes的含义:

var nodes = svg.selectAll("circle")
    .data(dataset.nodes)
    .enter()
    .append("circle")

因此,您正在将文本附加到圆圈上,但这行不通。它们会在检查页面时显示出来(如<circle><text></text></circle>),但实际上在SVG中不会显示任何内容。

解决方案:只需更改为:

var label = svg.selectAll(null)
    .data(dataset.nodes)
    .enter()
    .append("text")
    .text(function (d) { return d.name; })
    .style("text-anchor", "middle")
    .style("fill", "#555")
    .style("font-family", "Arial")
    .style("font-size", 12);

这里是示例代码: https://jsfiddle.net/gerardofurtado/7pvhxfzg/1/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接