我希望根据节点类型向我的节点添加不同的子元素。因此,该节点具有名为type
的属性。所有节点都应由一个包含相关子元素的g
元素组成。
我尝试使用D3的filter
功能,但我卡住了,因为我的代码不仅一次添加子元素,而是多次添加所需的子元素(与我拥有的节点数量相同)。所以我想我在选择方面做错了些什么。
我的图形的节点和链接会随时间改变,因此我所做的是首先存储选择,当一个节点被添加到self.nodes
时,我调用绘制函数(我将省略链接代码)。
self.domNodes = this.svg.append('g').attr('class', 'nodes').selectAll('.node')
function draw() {
self.domNodes = self.domNodes.data(self.nodes, (node) => node.id)
self.domNodes.exit().remove()
// all nodes
self.domNodes.enter()
.append('g')
.attr('class', (node) => `node ${node.type}`)
.merge(self.domNodes)
// contributions
self.domNodes.filter((d) => d.type === 'contribution')
.append('circle')
.attr('r', 4)
.attr('fill', 'blue')
// persons
self.domNodes.filter((d) => d.type === 'person')
.append('other elements and attributes...')
self.simulation.nodes(self.nodes)
self.simulation.force('link').links(self.links)
self.simulation.alpha(1).restart()
}
它的功能是区分person
和contribution
,并为此类型添加我想要的元素,但它不仅在每个g
节点中添加一个元素,而是添加多个(我有的节点数)到每个g
节点中。如果我继续调用绘制函数,它将在我的
<svg>
<g>
<g class="nodes">
<g class="node contribution" transform="translate(466, 442)">
<circle r="4" fill="blue"></circle>
<circle r="4" fill="blue"></circle>
<circle r="4" fill="blue"></circle>
</g>
<g class="node contribution" transform="translate(466, 442)">
<circle r="4" fill="blue"></circle>
<circle r="4" fill="blue"></circle>
<circle r="4" fill="blue"></circle>
</g>
<g class="node contribution" transform="translate(466, 442)">
<circle r="4" fill="blue"></circle>
<circle r="4" fill="blue"></circle>
<circle r="4" fill="blue"></circle>
</g>
<g class="node person" transform="translate(400, 200)">
<someotherthings></someotherthings>
<someotherthings></someotherthings>
</g>
<g class="node person" transform="translate(400, 200)">
<someotherthings></someotherthings>
<someotherthings></someotherthings>
</g>
</g>
</g>
</svg>
我在这里做错了什么?我只想在每个节点中添加一个
circle
和其他元素,但它们似乎被重复添加了。<svg>
<g>
<g class="nodes">
<g class="node contribution" transform="translate(466, 442)">
<circle r="4" fill="blue"></circle>
</g>
<g class="node contribution" transform="translate(466, 442)">
<circle r="4" fill="blue"></circle>
</g>
<g class="node contribution" transform="translate(466, 442)">
<circle r="4" fill="blue"></circle>
</g>
<g class="node person" transform="translate(400, 200)">
<someotherthings></someotherthings>
</g>
<g class="node person" transform="translate(400, 200)">
<someotherthings></someotherthings>
</g>
</g>
</g>
</svg>
非常感谢您的帮忙。
draw()
时,多个子节点是否出现 - 或者您必须调用它多次以使节点出现(最初)或多个子节点存在? - Andrew Reid