D3 – v5 更新多个文本元素的模式

huangapple go评论73阅读模式
英文:

D3 - v5 update pattern on multiple text elements

问题

在以下代码中,我尝试创建一个用于按小时购买的市场可视化。我试图遵循v5s的更新模式,但无法将两个不同的<text>元素连接在一起。最后添加的连接会覆盖第一个,所以8。

我查找了一下,但找不到与两个相同元素的更新模式相关的内容。

链接到示例

const updateCircles = () => {
    const circles = d3.select('svg')
        .selectAll('circle');
    circles
        .data(dataPoints)
        .join('circle')
        .attr('cx', xPosition)
        .attr('cy', canvasHeight)
        .attr('r', circleRadius)
        .attr('id', (d) => d.uniqueid)
        .attr('fill', (d) => d.color);

    const text = d3.select('svg')
        .selectAll('text')
        .data(dataPoints);

    text
        .join()
        .attr('x', xPosition)
        .attr('y', canvasHeight)
        .attr('id', (d) => d.uniqueid)
        .text((d) => d.description);

    text
        .join()
        .attr('x', xPosition)
        .attr('y', canvasHeight + 15)
        .attr('id', (d) => d.uniqueid)
        .text((d) => `${d.value} KwH`);

};
if (update === true) {
    updateCircles();
} else {
    const circles = selection.selectAll('circle')
        .data(dataPoints, (d) => d.id);

    const text = selection.selectAll('text')
        .data(dataPoints);

    circles
        .enter().append('circle')
        .attr('cx', xPosition)
        .attr('cy', canvasHeight)
        .attr('r', circleRadius)
        .attr('id', (d) => d.uniqueid)
        .attr('fill', (d) => d.color)
        .merge(circles);

    text
        .enter().append('text')
        .attr('x', xPosition)
        .attr('y', canvasHeight)
        .attr('id', (d) => d.uniqueid)
        .merge(text)
        .text((d) => d.description);

    text
        .enter().append('text')
        .attr('x', xPosition)
        .attr('y', canvasHeight + 15)
        .attr('id', (d) => d.uniqueid)
        .merge(text)
        .text((d) => `${d.value} KwH`);
}
英文:

In the following code I tried to create a visualization for a market on which one buys per hour. I tried to follow v5s update pattern but it won't let me join two text different &lt;text&gt; elements. The last added join overwrites the first so 8

I've looked around but I can not find anything related to an update pattern for two of the same elements.

https://jsfiddle.net/itsahoax/gd2uew73/7/

                const updateCircles = () =&gt; {
const circles = d3.select(&#39;svg&#39;)
.selectAll(&#39;circle&#39;);
circles
.data(dataPoints)
.join(&#39;circle&#39;)
.attr(&#39;cx&#39;, xPosition)
.attr(&#39;cy&#39;, canvasHeight)
.attr(&#39;r&#39;, circleRadius)
.attr(&#39;id&#39;, (d) =&gt; d.uniqueid)
.attr(&#39;fill&#39;, (d) =&gt; d.color);
const text = d3.select(&#39;svg&#39;)
.selectAll(&#39;text&#39;)
.data(dataPoints);
text
.join()
.attr(&#39;x&#39;, xPosition)
.attr(&#39;y&#39;, canvasHeight)
.attr(&#39;id&#39;, (d) =&gt; d.uniqueid)
.text((d) =&gt; d.description);
text
.join()
.attr(&#39;x&#39;, xPosition)
.attr(&#39;y&#39;, canvasHeight + 15)
.attr(&#39;id&#39;, (d) =&gt; d.uniqueid)
.text((d) =&gt; `${d.value} KwH`);
};
if (update === true) {
updateCircles();
} else {
const circles = selection.selectAll(&#39;circle&#39;)
.data(dataPoints, (d) =&gt; d.id);
const text = selection.selectAll(&#39;text&#39;)
.data(dataPoints);
circles
.enter().append(&#39;circle&#39;)
.attr(&#39;cx&#39;, xPosition)
.attr(&#39;cy&#39;, canvasHeight)
.attr(&#39;r&#39;, circleRadius)
.attr(&#39;id&#39;, (d) =&gt; d.uniqueid)
.attr(&#39;fill&#39;, (d) =&gt; d.color)
.merge(circles);
text
.enter().append(&#39;text&#39;)
.attr(&#39;x&#39;, xPosition)
.attr(&#39;y&#39;, canvasHeight)
.attr(&#39;id&#39;, (d) =&gt; d.uniqueid)
.merge(text)
.text((d) =&gt; d.description);
text
.enter().append(&#39;text&#39;)
.attr(&#39;x&#39;, xPosition)
.attr(&#39;y&#39;, canvasHeight + 15)
.attr(&#39;id&#39;, (d) =&gt; d.uniqueid)
.merge(text)
.text((d) =&gt; `${d.value} KwH`);
}
};

答案1

得分: 1

不要使用元素选择器,如果您有多个具有相同选择器的不同内容的元素(例如&lt;text&gt;)。请给它们添加类并使用.selectAll('.className')

这里有一个使用selection.join的工作示例JSFiddle

关于selection.join的更多信息可以在这里找到。

// 渲染代码
const circles = (selection, dataPoints, isUpdate) => {
const xPosition = (d, i) => +i * 180 + 100;

const updateCircles = (data) => {
const circles = d3.select('svg').selectAll('.circle-area').data(data);
circles
.join((enter) => {
enter
.append('circle')
.attr('class', 'circle-area')
.attr('cx', xPosition)
.attr('cy', canvasHeight)
.attr('r', circleRadius)
.attr('id', (d) => d.uniqueid)
.attr('fill', (d) => d.color);
}, (update) => {
update.attr('fill', (d) => d.color);
}, (exit) => {
exit.remove();
});
const descriptionText = d3.select('svg').selectAll('.kwh-description').data(data);
descriptionText
.join((enter) => {
enter
.append('text')
.attr('class', 'kwh-description')
.attr('x', xPosition)
.attr('y', canvasHeight)
.attr('id', (d) => `description-${d.uniqueid}`)
.text((d) => d.description);
}, (update) => {
update.text((d) => d.description);
}, (exit) => {
exit.remove();
});
const valueText = d3.select('svg').selectAll('.kwh-value').data(data);
valueText
.join((enter) => {
enter
.append('text')
.attr('class', 'kwh-value')
.attr('x', xPosition)
.attr('y', canvasHeight + 15)
.attr('id', (d) => `value-${d.uniqueid}`)
.text((d) => `${d.value} KwH`);
}, (update) => {
update.text((d) => `${d.value} KwH`);
}, (exit) => {
exit.remove();
});
};
if (isUpdate) {
console.log(dataPoints)
updateCircles(dataPoints);
}

};

英文:

Do not use an element selector if you have multiple elements with different content with the same selector (e.g &lt;text&gt;). Add them class and use .selectAll(&#39;.className&#39;)
There is a working example using selection.join JSFiddle.

More information about selection.join [here] 2.

// render code
const circles = (selection, dataPoints, isUpdate) =&gt; {
const xPosition = (d, i) =&gt; +i * 180 + 100;
const updateCircles = (data) =&gt; {
const circles = d3.select(&#39;svg&#39;).selectAll(&#39;.circle-area&#39;).data(data);
circles
.join((enter) =&gt; {
enter
.append(&#39;circle&#39;)
.attr(&#39;class&#39;, &#39;circle-area&#39;)
.attr(&#39;cx&#39;, xPosition)
.attr(&#39;cy&#39;, canvasHeight)
.attr(&#39;r&#39;, circleRadius)
.attr(&#39;id&#39;, (d) =&gt; d.uniqueid)
.attr(&#39;fill&#39;, (d) =&gt; d.color);
}, (update) =&gt; {
update.attr(&#39;fill&#39;, (d) =&gt; d.color);
}, (exit) =&gt; {
exit.remove();
});
const descriptionText = d3.select(&#39;svg&#39;).selectAll(&#39;.kwh-description&#39;).data(data);
descriptionText
.join((enter) =&gt; {
enter
.append(&#39;text&#39;)
.attr(&#39;class&#39;, &#39;kwh-description&#39;)
.attr(&#39;x&#39;, xPosition)
.attr(&#39;y&#39;, canvasHeight)
.attr(&#39;id&#39;, (d) =&gt; `description-${d.uniqueid}`)
.text((d) =&gt; d.description);
}, (update) =&gt; {
update.text((d) =&gt; d.description);
}, (exit) =&gt; {
exit.remove();
});
const valueText = d3.select(&#39;svg&#39;).selectAll(&#39;.kwh-value&#39;).data(data);
valueText
.join((enter) =&gt; {
enter
.append(&#39;text&#39;)
.attr(&#39;class&#39;, &#39;kwh-value&#39;)
.attr(&#39;x&#39;, xPosition)
.attr(&#39;y&#39;, canvasHeight + 15)
.attr(&#39;id&#39;, (d) =&gt; `value-${d.uniqueid}`)
.text((d) =&gt; `${d.value} KwH`);
}, (update) =&gt; {
update.text((d) =&gt; `${d.value} KwH`);
}, (exit) =&gt; {
exit.remove();
});
};
if (isUpdate) {
console.log(dataPoints)
updateCircles(dataPoints);
}
};

huangapple
  • 本文由 发表于 2020年1月6日 22:30:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/59613854.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定