- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试根据链接为某些节点着色,但我不确定该怎么做。这是我当前的图表:
我一直在尝试自动为同一集群内的所有节点着色(即通过作为集群内任何节点的源或目标相互连接),但到目前为止,我所有的尝试都是徒劳的。 .
我听说我可能需要做一个递归函数,但是我的递归是自学的,而且从根本上是错误的。这是我当前的代码:
function assignGroup() {
var groupedNodes = [];
for(var i = 0; i < gNodes.length; i++) {
if(nodes[i].group !== undefined) {
nodes[i].group = undefined;
}
}
for(var i = 0; i < nodes.length; i++) {
if(nodes[i].group === undefined) {
nodes[i].group = i;
recursive(nodes[i],i);
}
}
function recursive(rNode, rGrp) {
var tempSrc = hasSrc(rNode);
var tempTarg = hasTarg(rNode);
if(tempSrc == null && tempTarg == null)
return;
if(tempSrc != null && tempSrc.group === undefined) {
tempSrc.group = rGrp;
recursive(tempSrc, rGrp);
}
if(tempTarg != null && tempTarg.group === undefined) {
tempTarg.group = rGrp;
recursive(tempTarg, rGrp);
}
}
function hasTarg(eNode) {
for(var i = 0; i < edges.length; i++) {
if(nodes.name == edges[i].source)
return getNode(nodes, edges[i].target);
else
return null;
}
}
function hasSrc(eNode) {
for(var i = 0; i < edges.length; i++) {
if (nodes.name == edges[i].target)
return getNode(edges[i].source);
else
return null;
}
}
function getNode(id) {
console.log(id);
for(var i = 0; i < nodes.length; i++) {
if(id == nodes[i].name) {
return nodes[i];
}
}
return null;
}
我的方法是为每个节点分配一个组,并根据它们的组为它们着色,本质上是一石二鸟(组也可以用于 future 的实现)。
我的数据集是:
{
"nodes":
[
{
"name": "Ben",
},
{
"name": "May",
},
{
"name": "Jack",
},
{
"name": "Francis",
},
{
"name": "Owen",
},
{
"name": "Blake",
},
{
"name": "Julia",
},
{
"name": "Liam",
}
],
"edges":
[
{
"source":"Ben",
"target":"May"
},
{
"source":"Ben",
"target":"Blake"
},
{
"source":"Ben",
"target":"Owen"
},
{
"source":"Owen",
"target":"Julia"
}
]
}
这是我的节点数据集的预期结果:
"nodes":
[
{
"name": "Ben",
"group": 1
},
{
"name": "May",
"group": 1
},
{
"name": "Jack",
"group": 2 /*Arbitrary group (Ungrouped)*/
},
{
"name": "Francis",
"group": 3 /*Arbitrary group (Ungrouped)*/
},
{
"name": "Owen",
"group": 1
},
{
"name": "Blake",
"group": 1
},
{
"name": "Julia",
"group": 1
},
{
"name": "Liam",
"group": 4 /*Arbitrary group (Ungrouped)*/
}
]
编辑:这是 jsfiddle:https://jsfiddle.net/ehnf76xg/2/
最佳答案
这是我的解决方案。首先,我们给每个节点一个不同的编号:
data.nodes.forEach(function(d, i) {
d.group = i
});
如您所知,数字本身并不重要。
然后我们检查每个节点的名称是否在 edges
数组中每个对象的 source
或 target
中找到。如果是,我们将其编号提供给 nodes
数组中的源和目标通讯员:
data.nodes.forEach(function(d) {
data.edges.forEach(function(e) {
if (e.source === d.name || e.target === d.name) {
data.nodes.find(function(f) {
return f.name === e.source
}).group = d.group;
data.nodes.find(function(f) {
return f.name === e.target
}).group = d.group;
}
})
})
这就像一个感染过程:在 source
或 target
上找到名称的第一个节点传播它的编号。同样,数字本身并不重要。
这是一个演示:
var data = {
"nodes": [{
"name": "Ben",
}, {
"name": "May",
}, {
"name": "Jack",
}, {
"name": "Francis",
}, {
"name": "Owen",
}, {
"name": "Blake",
}, {
"name": "Julia",
}, {
"name": "Liam",
}],
"edges": [{
"source": "Ben",
"target": "May"
}, {
"source": "Ben",
"target": "Blake"
}, {
"source": "Ben",
"target": "Owen"
}, {
"source": "Owen",
"target": "Julia"
}]
};
data.nodes.forEach(function(d, i) {
d.group = i
});
data.nodes.forEach(function(d) {
data.edges.forEach(function(e) {
if (e.source === d.name || e.target === d.name) {
data.nodes.find(function(f) {
return f.name === e.source
}).group = d.group;
data.nodes.find(function(f) {
return f.name === e.target
}).group = d.group;
}
})
})
console.log(data)
现在,让我们在一个真实的力导向图中看到它:
var data = {
"nodes": [{
"name": "Ben",
},{
"name": "May",
}, {
"name": "Jack",
}, {
"name": "Liam",
},{
"name": "Francis",
}, {
"name": "Owen",
}, {
"name": "Blake",
}, {
"name": "Julia",
}],
"edges": [{
"source": "Ben",
"target": "May"
}, {
"source": "Ben",
"target": "Blake"
}, {
"source": "Ben",
"target": "Owen"
}, {
"source": "Owen",
"target": "Julia"
}]
};
data.nodes.forEach(function(d, i) {
d.group = i
});
data.nodes.forEach(function(d) {
data.edges.forEach(function(e) {
if (e.source === d.name || e.target === d.name) {
data.nodes.find(function(f) {
return f.name === e.source
}).group = d.group;
data.nodes.find(function(f) {
return f.name === e.target
}).group = d.group;
}
})
})
var svg = d3.select("svg")
var force = d3.forceSimulation()
.force("link", d3.forceLink()
.id(function(d) {
return d.name
}))
.force("charge", d3.forceManyBody().strength(-2))
.force("collide", d3.forceCollide(15))
.force("center", d3.forceCenter(150, 70));
var edges = svg.selectAll("line")
.data(data.edges)
.enter()
.append("line")
.style("stroke", "#aaa")
.style("stroke-width", 2);
var color = d3.scaleOrdinal(d3.schemeCategory10);
var nodes = svg.selectAll("circle")
.data(data.nodes)
.enter()
.append("circle")
.attr("r", 10)
.style("stroke", "#444")
.style("stroke-width", 2)
.style("fill", function(d) {
return color(d.group);
})
force.nodes(data.nodes);
force.force("link")
.links(data.edges);
force.on("tick", function() {
edges.attr("x1", function(d) {
return d.source.x;
})
.attr("y1", function(d) {
return d.source.y;
})
.attr("x2", function(d) {
return d.target.x;
})
.attr("y2", function(d) {
return d.target.y;
})
nodes.attr("cx", function(d) {
return d.x;
})
.attr("cy", function(d) {
return d.y;
});
});
<script src="https://d3js.org/d3.v4.min.js"></script>
<svg></svg>
关于javascript - JS/d3.js : Creating groups for source/target links,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43818361/
这些指针之间有区别吗?每次通话到底发生了什么。 *p++ (*p)++, *(p)++ 最佳答案 1和3是一样的。 请记住 ++ 的后缀和一元形式。和 --有一个结果和一个副作用: x++ 的结果是
这个问题已经有答案了: difference between grep Vs cat and grep (5 个回答) 已关闭 8 年前。 我看到一个例子,其中有人这样做: cat source.tx
它曾经有效。现在,当我添加一个断点时: saveSnippet: (title, imageUrl, role) => { debugger; ... chrome (
开发.Net Web应用程序时,如果生成运行时错误,则会显示一些在Exception类中找不到的“额外”调试信息。 它显示了“源错误”部分,其中显示了代码摘录,其中行号准确显示了错误的产生位置,并显示
Firefox 中的“源”和“生成的源”有什么区别? 请举例说明。 编辑: 7 月 3 日 “搜索引擎”使用哪个来源,生成的还是生成前的? 最佳答案 Source 将显示页面加载的源(由服务器提供)。
对于具有两个不同工作表的Excel文件,我有两个OLE DB源。工作表A和工作表B。工作表A单元格I6包含日期,我想组合这两个源并在工作表B中添加一列,以将该值设置为工作表A的日期值。有可能做到吗?任
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
这是我的代码: import speech_recognition as sr r = sr.Recognizer() with sr.Microphone() as source: prin
我是 mysql 新手。我正在尝试 setter 工示例数据库 我尝试了 stackoverflow 中提到的一些方法,但没有帮助 谁能告诉我如何解决这个问题 SELECT 'LOADING depa
在终端中,我启动程序如下: 1) source env.sh 2) source activate enviroment 3) program --args 除了在 Pycharm 中并调试代码之外,
IntelliJ 如何知道目录是“源”还是“测试源”?如何始终将目录标记为“测试源”? build.gradle 1 apply plugin: 'java' apply plugin: 'idea'
这个问题类似于Source script to separate environment in R, not the global environment , 但有一个关键的转折。 考虑一个源另一个脚
和有什么区别--devtool source-map & eval-source-map ? 最佳答案 webpack 文档有一个方便的图表,说明这些不同的选项可能适合哪些情况。 他们显示eval-s
这个问题已经有答案了: Issue with virtualenv - cannot activate (36 个回答) 已关闭 4 年前。 venv) C:\Users\Sunil\PycharmP
在以前版本的 Akka Streams 中,groupBy 返回一个 Source 的 Source 可以具体化为一个 Source[Seq [A]]. 在 Akka Streams 2.4 中,我看
这个问题已经有答案了: Issue with virtualenv - cannot activate (36 个回答) 已关闭 4 年前。 venv) C:\Users\Sunil\PycharmP
是否可以获取 Bash 片段的源代码,但仅在特定条件成立时才实际提供其中的函数? 所以我要问的是,我可以无条件地获取目录中的所有文件,但获取的文件包含是否向采购外壳提供功能的逻辑。 例子: .bash
我无法查看 JavaCore.class 源代码,但我可以很好地使用代码。 例如,要查看方法JavaCore.create(..) 的源代码,我ctrl - click(或按f3) 在 JavaCor
-- Sample employee database -- See changelog table for details -- Copyright (C) 2007,2008, MySQL
当我在我的 IDE 中编译项目时它工作正常但是当我在 bamboo 中编译时它给我以下错误。 我已经检查过我在任务中配置的 jdk 版本是 1.6,我还尝试从 pom 中的 maven 插件强制执行
我是一名优秀的程序员,十分优秀!