The text-anchor attribute works as expected on an svg element created by D3. However, you need to append the text
and the circle
into a common g
element to ensure that the text
and the circle
are centered with one another.
To do this, you can change your nodes
variable to:
var nodes = svg.append("g")
.attr("class", "nodes")
.selectAll("circle")
.data(dataset)
.enter()
// Add one g element for each data node here.
.append("g")
// Position the g element like the circle element used to be.
.attr("transform", function(d, i) {
// Set d.x and d.y here so that other elements can use it. d is
// expected to be an object here.
d.x = i * 70 + 50,
d.y = svg_h / 2;
return "translate(" + d.x + "," + d.y + ")";
});
Note that the dataset
is now a list of objects so that d.y
and d.x
can be used instead of just a list of strings.
Then, replace your circle
and text
append code with the following:
// Add a circle element to the previously added g element.
nodes.append("circle")
.attr("class", "node")
.attr("r", 20);
// Add a text element to the previously added g element.
nodes.append("text")
.attr("text-anchor", "middle")
.text(function(d) {
return d.name;
});
Now, instead of changing the position of the circle
you change the position of the g
element which moves both the circle
and the text
.
Here is a JSFiddle showing centered text on circles.
If you want to have your text be in a separate g
element so that it always appears on top, then use the d.x
and d.y
values set in the first g
element's creation to transform
the text.
var text = svg.append("svg:g").selectAll("g")
.data(force.nodes())
.enter().append("svg:g");
text.append("svg:text")
.attr("text-anchor", "middle")
.text(function(d) { return d.name; });
text.attr("transform", function(d) {
return "translate(" + d.x + "," + d.y + ")";
});
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…