У меня есть граф, ориентированный на силу D3, и каждый узел отображает метку. Длина этой метки может варьироваться от одной строки текста до нескольких строк текста. Я успешно создал многострочную метку для узлов, обратившись к этому пост. Однако я хотел бы вертикально центрировать метку над узлом. Мне не удалось переназначить положение метки по вертикальному центру таким образом, чтобы это было эффективно для всех типов меток (например, однострочные метки, двухстрочные метки и т. д.).
По сути, я не уверен, как центрировать метку в целом, сохраняя при этом разделение между каждой строкой текста в метке. Любая помощь будет оценена.
var node = svg.selectAll('.node')
.data(force.nodes())
.enter().append('circle')
.attr('class', 'node')
.attr('r', width * 0.01)
.style('fill', function(d) {return color(d.group); })
var maxLength = 20;
var separation = 12;
var textX = 0;
var text = svg.selectAll(".text")
.data(nodes)
.enter().append("text")
.style("text-anchor", "middle")
.each(function (d) {
var lines = wordwrap2(d.name, maxLength).split('\n');
for (var i = 0; i < lines.length; i++) {
d3.select(this)
.append("tspan")
.attr("dy", separation)
.attr("x", textX)
.text(lines[i]);
}});
function wordwrap2( str, width, brk, cut ) {
brk = brk || '\n';
width = width || 75;
cut = cut || false;
if (!str) { return str; }
var regex = '.{0,' +width+ '}(\\s|$)' + (cut ? '|.{' +width+ '}|.+$' : '|\\S+?(\\s|$)');
return str.match( RegExp(regex, 'g') ).join( brk );
};