score:18

Accepted answer

You are adding the text element inside the circle element - try running your code and have a look at the svg with the DOM inspector. I'm not sure text is allowed there. Instead add the text elements separately - like another rendering of the nodes:

var texts = svg.selectAll("text.label")
                .data(graph.nodes)
                .enter().append("text")
                .attr("class", "label")
                .attr("fill", "black")
                .text(function(d) {  return d.name;  });

force.on("tick", function() {
    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; });

    node.attr("cx", function(d) { return d.x; })
        .attr("cy", function(d) { return d.y; });

    texts.attr("transform", function(d) {
        return "translate(" + d.x + "," + d.y + ")";
    });
});

score:4

Another option would be to add both circle and text elements inside a g container element as shown below:

var container = svg.selectAll("g.node").data(graph.nodes).enter().append("g")
.attr("class", "node")
.attr("transform", function (d) {
    return "translate(" + d.x + "," + d.y + ")";
}).call(force.drag);

container.append("circle")
.attr("r", 5)
.style("fill", color);

container.append("text")
.style("text-anchor", "middle")
.text(function (d) {
    return d.name;
});

Here you can play with a working jsfiddle:


Related Query