javascript d3.js text label force-layout

javascript - Agregar etiqueta de texto al nodo d3 en el diseño Force



d3.js label (1)

Este es mi código, también puede tener código completo en JsFiddle . Quiero tener etiquetas en cada nodo, pero no puedo. Por cierto, las etiquetas se pueden incrustar en el círculo de la console .

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; }); });


En este momento, está agregando los elementos de text elementos del circle , y eso simplemente no funcionará.

Cuando escribes...

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

Estás agregando los textos a la selección de nodes . Sin embargo, debe tener en cuenta qué nodes son:

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

Por lo tanto, está agregando los textos a los círculos, y eso no funciona. Aparecen cuando inspecciona la página (como <circle><text></text></circle> ), pero en realidad nada aparecerá en el SVG.

Solución : simplemente cambie a:

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);

Aquí está el violín: https://jsfiddle.net/gerardofurtado/7pvhxfzg/1/