Подтвердить что ты не робот

Как центрировать текст в прямом элементе в d3?

Я создал визуализацию d3, которая принимает массив данных, создает прямую для каждой точки данных, а затем отображает текст в прямоугольнике. Тем не менее, я только получил текст для отображения внутри прямоугольника, указав его координаты. Мне интересно, как бы я сказал, чтобы сосредоточиться на элементе rect. Вот код:

var elementTags = ["Google", "Amazon", "Wikipedia", "Yahoo!", "Messi", "Ronaldo", "One", "Two", "Three",
             "Monkey"];

Следующая часть создает массивы, которые я использовал для размещения прямоугольников

            var xPosLoop = [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3];
            var yPosLoop = [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5]

установите их ширину и высоту

            var elementWidth = 210;
            var elementHeight = 60;

создайте контейнер svg и добавьте rects

            var svgContainer = d3.select("body") //create container
                    .append("svg")
                    .attr("width", 1000)
                    .attr("height", 1000);
            var enterElements = svgContainer.selectAll("rect") //draw elements
                    .data(elementTags).enter().append("rect")
                    .attr("x", function(d, i){
                        return xPosLoop[i]*(elementWidth+25);
                    })
                    .attr("height", elementHeight)
                    .attr("y", function(d, i){
                        return yPosLoop[i]*(elementHeight+35);
                    })
                    .attr("width", elementWidth)
                    .attr("rx", 4)
                    .attr("fill", "steelblue")
                    .attr("stroke", "black")
                    .attr("stroke-width", 1);
            var addText = svgContainer.selectAll("text").data(elementTags).enter().append("text");

и вот где я скажу текст, где отображать, это также, где мне нужна помощь. Я хочу, чтобы текст автоматически центрировался в прямоугольниках.

            var textElements = addText
                .attr("x", function(d, i){
                    return ((xPosLoop[i]*(elementWidth+25) +elementWidth/2))
                })
                .attr("y", function(d, i){
                    return ((yPosLoop[i]*(elementHeight+35)) + elementHeight/2 + 3)
                })
                .attr("font-family", "Arial Black")
                .attr("font-size", "20px")
                .attr("fill", "white")
                .text(function(d, i){return d;});
4b9b3361

Ответ 1

Кажется, что ваш код правильно вычисляет центр прямоугольника и помещает текст в эту точку, за исключением того, что текст выравнивается влево. Если это так, вам просто нужно изменить свойство text-anchor, чтобы центрировать текст. Это будет:

textElements.style("text-anchor", "middle")