在 D3js 强制图中添加和删除节点
Adding and Removing Nodes in D3js Force Graph
我正在从数据库加载json
并创建一个加载良好的json
文件。现在我不知道要采取哪些步骤来使节点在力导向图中响应。我需要删除并添加新节点及其链接。
force.nodes(json.nodes)
.links(json.links)
.start();
initNodes(json);
如何在不重置整个可视化效果的情况下使其更加动态或更新它?
我已经看到这个问题几次没有得到回答,所以我希望有人可以发布并提供指导。
在 D3 力图中添加节点/链接非常令人困惑,直到我更好地理解了添加初始节点集的方式。
假设您希望将<g>
用于节点:
// Select the element where you'd like to create the force layout
var el = d3.select("#svg");
// This should not select anything
el.selectAll("g")
// Because it's being compared to the data in force.nodes()
.data(force.nodes())
// Calling `.enter()` below returns the difference in nodes between
// the current selection and force.nodes(). At this point, there are
// no nodes in the selection, so `.enter()` should return
// all of the nodes in force.nodes()
.enter()
// Create the nodes
.append("g")
.attr("id", d.name)
.classed("manipulateYourNewNode", true);
现在让我们制作一个函数,一旦图形初始化,它将向布局添加一个节点!
newNodeData
是一个对象,其中包含要用于新节点的数据。 connectToMe
是一个字符串,其中包含要将新节点连接到的节点的唯一 ID。
function createNode (newNodeData, connectToMe) {
force.nodes().push(newNodeData);
el.selectAll("g")
.data(force.nodes(), function(datum, index) { return index })
作为.data()
中可选的第二个参数给出的函数对选择中的每个节点运行一次,对force.nodes()
中的每个节点运行一次,根据返回值匹配它们。如果未提供任何函数,则调用回退函数,该函数返回index
(如上所述(。
但是,您新选择的索引(我相信顺序是随机的(和force.nodes()
中的顺序之间很可能会有争议。相反,您很可能需要该函数返回每个节点唯一的属性。
这一次,.enter()
只会返回您尝试添加的节点作为newData
,因为 .data()
的第二个参数没有找到它的键。
.enter()
.insert("g", "#svg")
.attr("id", d.name)
.classed("manipulatYourNewNode", true);
createLink(connectToMe, newNodeData.name);
force.start();
}
函数createLink(定义如下(在新节点和所选节点之间创建链接。
此外,d3js API 声明应在更新布局后调用 force.start((。
注意:当我第一次尝试弄清楚如何向图形添加节点和链接时,在函数开始时调用force.stop()
对我来说是一个巨大的帮助。
function createLink (from, to) {
var source = d3.select( "g#" + from ).datum(),
target = d3.select( "g#" + to ).datum(),
newLink = {
source: source,
target: target,
value: 1
};
force.links().push(newLink);
下面的代码在以下假设下工作:
-
#links
是包含所有链接元素的包装元素 您的链接表示为
<line>
元素:d3.select("#links") .selectAll("line") .data(force.links()) .enter() .append("line");
您可以在此处查看如何附加新节点和关系的示例:http://bl.ocks.org/2432083
摆脱节点和关系稍微棘手一些,但您可以在此处看到该过程:http://bl.ocks.org/1095795
- 根据Select值添加/删除表行
- 添加/删除类淡入淡出不起作用
- p5.js声音库:如何添加/删除p5.第5页中的短语().零件()
- 在django表单集中添加/删除表单的Javascript
- 添加/删除子元素
- 添加/删除/更改输入文本的部分值
- jQuery - 添加删除类 - 设置输入值
- 向具有唯一Id的表添加/删除行
- DateTimePicker:函数从minDate maxDate添加删除日期
- 由 JavaScript 控制的 CSS3 单向转换在按顺序添加/删除类时不起作用
- 添加/删除类在 Chrome 中对我不起作用
- JQuery 测试元素是可见的还是隐藏的,然后添加删除类
- Jquery切换和添加/删除
- 克隆字段上的“添加-删除”按钮
- (X-Editable)与(Select2标签)不工作,可以't填充当前标签并跟踪添加/删除的标签
- 添加/删除要与Jquery进行比较的产品
- 添加/删除类并使用Cookie记住所选内容
- 如何使用延迟添加/删除类
- 如何根据数组内容添加/删除数组中的元素
- 单击单选按钮,添加/删除表单元素的类