Как добавить текст динамически после создания прямоугольника - PullRequest
0 голосов
/ 26 февраля 2019

Динамический код для прямоугольного значения:

 g.append('g')
                  .selectAll('g')
                  .data(data)
                  .enter()
                  .append('g')
                  .attr('transform', d => 'translate(' + x0(d.State) + ',0)')
                  .selectAll('rect')
                  .data(d => keys.map(key => {return {key: key, value: d[key]}}))
                  .enter().append('rect')
                  .attr('x', d => x1(d.key))
                  .attr('y', d => y(d.value))
                  .attr('width', x1.bandwidth())
                  .attr('height', d => innerHeight - y(d.value))
                  .attr('fill', d =>  z(d.key))
                  .append('text')
                  .text(function(d) { return d.value; })

Результат выглядит следующим образом:

 <g transform="translate(44,0)"><rect x="11" y="0" width="185" height="420" fill="#333333"></rect>
    <rect x="206" y="0" width="185" height="420" fill="#3490e9">
         <text>1</text>
    </rect>
    <rect x="401" y="420" width="185" height="0" fill="#ff5a00">
        <text>0</text>
    </rect>
    <rect x="596" y="420" width="185" height="0" fill="#9932CC">
        <text>0</text>
      </rect>
</g>

Ожидаемый результат:

 <g transform="translate(44,0)">
        <rect x="11" y="0" width="185" height="420" fill="#333333"></rect>
        <text>1</text>
        <rect x="206" y="0" width="185" height="420" fill="#3490e9"> 
         </rect>
        <text>1</text>
        <rect x="401" y="420" width="185" height="0" fill="#ff5a00"> 
        </rect>
        <text>1</text>
        <rect x="596" y="420" width="185" height="0" fill="#9932CC">
          </rect>
        <text>0</text>
    </g>

Мне нужен text вне каждого прямоугольника.Поскольку текстовое значение не отображается на гистограмме.

Я попытался с помощью afterinsert попытаться, но безуспешно

Также пробовал как

g.append('text')
 .text(function(d) { return d.value; })

, но этотолько создать 1 text element за пределами g

В любом случае g мой svg

1 Ответ

0 голосов
/ 26 февраля 2019

Вы получаете text элементы, вложенные в элемент rect из-за цепочки методов D3, где функции возвращают элемент, с которым работали (если функции используются для установки значения).Это означает, что когда у вас есть цепочка функций, похожих на ваши (здесь упрощенно):

.append('g')
...
.selectAll('rect').data([data]).enter()
.append('rect')
...
.append('text')

Затем вы сначала добавляете g, затем добавляете элемент rect для каждой точки данных в вашем массиве, прежде чем наконец добавить элемент text к каждомуrect element

Есть несколько способов добраться туда, где вы хотите быть.При этом вы не получите точное представление DOM, которое вы наметили, но вы можете добиться того же эффекта.

Я бы порекомендовал объединить элементы rect и text попарно в элемент g для каждой точки данных, например:

const outerG = g.append('g')
    .selectAll('g')
    .data(data)
    .enter()
    .append('g')
    .attr('transform', d => 'translate(' + x0(d.State) + ',0)')

const pairG = outerG.selectAll('g')
    .data(d => keys.map(key => {return {key: key, value: d[key]}}))
    .enter().append('g')
    
pairG.append('rect')
    .attr('x', d => x1(d.key))
    .attr('y', d => y(d.value))
    .attr('width', x1.bandwidth())
    .attr('height', d => innerHeight - y(d.value))
    .attr('fill', d =>  z(d.key))
    
pairG.append('text')
    .text(function(d) { return d.value; })

Сначала будет добавлен элемент g для каждой точки данных и сохранена ссылка на эти элементы g в pairG.Затем мы добавляем элемент rect и элемент text индивидуально к переменной pairG.Это работает, потому что D3 делает точки данных, используемые для добавления предыдущего g, доступными для элементов rect и text.Если бы мы делали новую последовательность .selectAll('foo').data([data]).enter().append('foo'), это было бы не так, поскольку это привело бы к появлению новых точек данных.

Код, который я вставил, должен работать с вашими данными и настройкой, хотя я не могуконечно, поскольку у меня нет доступа к данным, шкалам и переменным, которые вы используете.

...