我有一堆静态圆圈,我想用线条连接它们(这是一个依赖图).我看到的所有示例都是使用d3的现成布局完成的,我不确定如何有效地处理这个问题.我还想在鼠标悬停在该节点上时突出显示与节点相关的线条,以及淡化任何其他形状/线条.
这就是我现在所拥有的:(它只是根据给定的区域大小绘制均匀间隔和大小的圆圈)
编辑:我修改后的代码:
我现在要做的是让线条指向的圆圈和颜色相似.我不知道如何从圆圈的"鼠标悬停"事件中引用它们.会做一些测试......
您尚未指定节点的连接方式,因此我假设所有内容都与所有内容相关联.原理与任何其他布局相同 - 您获取确定链接并将其传递给的数据.data()
.在您的代码中,坐标不是数据的一部分,这使得它更冗长,但仍然非常简单.
要添加链接,我正在使用嵌套选择 - 我g
为每个节点添加一个元素,并在与所有其他节点的连接下面添加元素.
var lines = svg.selectAll("g.line").data(dataset) .enter().append("g").attr("class", "line") .selectAll("line").data(dataset) .enter().append("line") .attr("x1", function(d, i) { return 2*node_radius_wo_pad+i%nodes_in_width*node_dia_inc_pad; }) .attr("y1", function(d, i) { return 2*node_radius_wo_pad+(parseInt(i/nodes_in_width))*node_dia_inc_pad; }) .attr("x2", function(d, i, j) { return 2*node_radius_wo_pad+j%nodes_in_width*node_dia_inc_pad; }) .attr("y2", function(d, i, j) { return 2*node_radius_wo_pad+(parseInt(j/nodes_in_width))*node_dia_inc_pad; });
这为每对节点添加了一行.请注意,它将在相同节点(您将无法看到)之间添加链接,并在每对节点之间添加2个链接 - 一次从一个节点开始,一次在另一个节点开始.我没有在这里过滤掉这些案例以保持代码简单.在您的特定应用程序中,我猜测无论如何都以另一种方式确定连接.
要突出显示在突出显示上连接特定节点的链接,我正在使用links
包含所有节点的变量,并过滤掉其起始坐标与圆坐标不同的变量.然后将过滤后的选择涂成红色.
.on("mouseover", function(){ var that = this; lines.filter(function() { return d3.select(this).attr("x1") == d3.select(that).attr("cx") && d3.select(this).attr("y1") == d3.select(that).attr("cy"); }).style("stroke", "red"); d3.select(this).style("fill", "aliceblue"); })
如果坐标是数据的一部分,那么一切都会变得容易一些,看起来更像是你在力布局中看到的例子.我建议创建一个数据结构很像什么用也为自己的链接,与source
和target
决定的源和目标节点的属性.
在这里完成示例.