使用 D3.js 修复力图节点的位置
Fix position of force-graph node using D3.js
我正在使用来自 https://github.com/vasturiano/force-graph 的 force-graph
D3 可视化。这似乎提供了很好的高级 API 来创建力导向图,但我发现很难自定义,因为我是 Javascript.
的新手
<script src="//unpkg.com/force-graph"></script>
<script src="http://d3js.org/d3.v4.min.js" charset="utf-8"></script>
<script>
fetch('data.json').then(res => res.json()).then(data => {
const Graph = ForceGraph()
(document.getElementById('graph'))
.graphData(data)
.nodeAutoColorBy('group')
.linkSource('source')
.linkTarget('target')
})
</script>
JSON 数据如下所示:
{
"nodes": [
{"id": "Myriel", "group": 1},
{"id": "Napoleon", "group": 1}
],
"links": [
{"source": "Napoleon", "target": "Myriel", "value": 1},
{"source": "Mlle.Baptistine", "target": "Myriel", "value": 8}
]
}
我正在尝试修复特定节点的位置,例如 id = Myriel
到 x=500
、y=500
。根据d3 force documentation,我需要指定fx
和fy
。如何检索特定节点的 ID 以设置这些属性?非常感谢任何帮助!
你提供的APIlink真漂亮。这是一个非常复杂的图表,它几乎符合每个方框。
但是,看起来让它适应您的需求的唯一方法是侵入我不建议的 js 代码。
就我个人而言,我会从更简单的 d3 版本开始,然后从这里进行自定义。
例如:https://observablehq.com/@d3/force-directed-graph
在这里,您需要自定义 simulation.on("tick" 函数。像这样:
node
.attr("cx", d => d.x)
.attr("cy", d => d.y)
**.attr("fx", d => d.id === "Myrial" ? 500 : null)**
**.attr("fy", d => d.id === "Myrial" ? 500 : null);**
`
或者对于与您的示例类似的方法,您可以使用 Vega。这允许您使用 fx 和 fy:
我找到了解决办法:
.nodeVal(node => {
node.fx = 500;
node.fy = 500
})
使用nodeVal
方法,我可以访问节点的属性来修复它。添加 if
语句将允许我仅在它是我需要的特定节点时更改它。感谢大家的帮助!
我正在使用来自 https://github.com/vasturiano/force-graph 的 force-graph
D3 可视化。这似乎提供了很好的高级 API 来创建力导向图,但我发现很难自定义,因为我是 Javascript.
<script src="//unpkg.com/force-graph"></script>
<script src="http://d3js.org/d3.v4.min.js" charset="utf-8"></script>
<script>
fetch('data.json').then(res => res.json()).then(data => {
const Graph = ForceGraph()
(document.getElementById('graph'))
.graphData(data)
.nodeAutoColorBy('group')
.linkSource('source')
.linkTarget('target')
})
</script>
JSON 数据如下所示:
{
"nodes": [
{"id": "Myriel", "group": 1},
{"id": "Napoleon", "group": 1}
],
"links": [
{"source": "Napoleon", "target": "Myriel", "value": 1},
{"source": "Mlle.Baptistine", "target": "Myriel", "value": 8}
]
}
我正在尝试修复特定节点的位置,例如 id = Myriel
到 x=500
、y=500
。根据d3 force documentation,我需要指定fx
和fy
。如何检索特定节点的 ID 以设置这些属性?非常感谢任何帮助!
你提供的APIlink真漂亮。这是一个非常复杂的图表,它几乎符合每个方框。
但是,看起来让它适应您的需求的唯一方法是侵入我不建议的 js 代码。
就我个人而言,我会从更简单的 d3 版本开始,然后从这里进行自定义。
例如:https://observablehq.com/@d3/force-directed-graph
在这里,您需要自定义 simulation.on("tick" 函数。像这样:
node
.attr("cx", d => d.x)
.attr("cy", d => d.y)
**.attr("fx", d => d.id === "Myrial" ? 500 : null)**
**.attr("fy", d => d.id === "Myrial" ? 500 : null);**
`
或者对于与您的示例类似的方法,您可以使用 Vega。这允许您使用 fx 和 fy:
我找到了解决办法:
.nodeVal(node => {
node.fx = 500;
node.fy = 500
})
使用nodeVal
方法,我可以访问节点的属性来修复它。添加 if
语句将允许我仅在它是我需要的特定节点时更改它。感谢大家的帮助!