请参阅d3 v4.0.0-alpha中的内联标签,
label.append("rect", "text")
.datum(() => this.nextSibling.getBBox())
.attr('x', d => (d.x - labelPadding))
.attr('y', d => (d.y - labelPadding))
.attr('width', d => (d.width + (2 * labelPadding)))
.attr('height', d => (d.height + (2 * labelPadding)));
它将通过 this 。
每个系列中的每个点都呈现标签。在此标签下,添加了一个白色矩形,其尺寸和位置是使用Element.GetBbox自动计算的。因此,由此产生的标签是清晰的
根据D3 V3 SET基准,我们应该创建一个新的选择,该选择不绑定到数据4(例如v4.7.4(中以后使用的数据。我试图创建如下的新选择,但是似乎Bbox是单个对象而不是多个对象,应该在D3 V4.0.0-Alpha中的上述代码中循环循环。
const newText = label.selectAll('text');
const bbox = newText.node().getBBox();
label.append('rect', 'text')
.datum(() => bbox)
.attr('x', d => (d.x - labelPadding))
.attr('y', d => (d.y - labelPadding))
.attr('width', d => (d.width + (2 * labelPadding)))
.attr('height', d => (d.height + (2 * labelPadding)));
您的摘要不起作用,原因很简单。但是,在解决这一问题之前,关于您的问题的一些考虑因素:
- Bostock(Inline Labels(的代码使用D3 v4 ,而不是V3。
-
append("rect", "text")
不会将矩形附加到文本上。它将矩形附加到容器上,无论是svg还是组元素(在这种特殊情况下,组(, 文本。
最后一个子弹点很重要,因为文本将始终是与矩形有关的nextSiblings
。
话虽如此,我们来到您的片段。当您这样做时:
const newText = label.selectAll('text');
const bbox = newText.node().getBBox();
您实际上只是在这样做:
const bbox = label.selectAll('text').node().getBBox();
,您的datum
功能最终将是:
.datum(() => label.selectAll('text').node().getBBox();)
好吧,这与Bostock的代码大不相同,因为这个...
label.selectAll('text').node()
...将选择所有text
元素,但仅返回到DOM中的第一个。这是由于node()
而发生的,它是:
返回此选择中的 first (non-null(元素。(强调我的(
另一方面,在Bostock的代码中,这个...
.datum(() => this.nextSibling.getBBox())
...将指向每次迭代时的一个不同的DOM元素,因为this.nextSibling
每次都会是一个不同的text
元素(正如我们在本答案开头所看到的那样,是相应矩形的nextSibling
(。