虽然遵循大量 D3 示例,但数据通常以 flare.json 中给出的格式进行格式化。 :
{
"name": "flare",
"children": [
{
"name": "analytics",
"children": [
{
"name": "cluster",
"children": [
{"name": "AgglomerativeCluster", "size": 3938},
:
我有一个邻接列表如下:
A1 A2
A2 A3
A2 A4
我想转换成上述格式。目前,我正在服务器端执行此操作,但有没有办法使用 d3 的功能来实现这一点?我找到了一个 here ,但该方法似乎需要修改 d3 核心库,由于可维护性,我不赞成。有什么建议吗?
最佳答案
没有规定的格式,因为您通常可以通过各种访问器函数(例如 hierarchy.children )和 array.map 重新定义数据.但是您引用的格式可能是树最方便的表示,因为它适用于默认访问器。
第一个问题是您是否打算显示 graph或 tree .对于图,数据结构是根据 nodes 定义的。和 links .对于树,布局的输入是根节点,它可能有一个数组 child nodes ,并且其叶节点具有关联的 value .
如果你想显示一个图表,而你所拥有的只是一个边列表,那么你需要遍历边以生成一个节点数组和一个链接。假设您有一个名为“graph.csv”的文件:
source,target
A1,A2
A2,A3
A2,A4
您可以使用 d3.csv 加载此文件然后产生一个节点和链接数组:
d3.csv("graph.csv", function(links) {
var nodesByName = {};
// Create nodes for each unique source and target.
links.forEach(function(link) {
link.source = nodeByName(link.source);
link.target = nodeByName(link.target);
});
// Extract the array of nodes from the map by name.
var nodes = d3.values(nodeByName);
function nodeByName(name) {
return nodesByName[name] || (nodesByName[name] = {name: name});
}
});
然后您可以将这些节点和链接传递给力布局以可视化图表:
如果您想生成一个树,那么您需要进行稍微不同形式的数据转换来为每个父节点累积子节点。
d3.csv("graph.csv", function(links) {
var nodesByName = {};
// Create nodes for each unique source and target.
links.forEach(function(link) {
var parent = link.source = nodeByName(link.source),
child = link.target = nodeByName(link.target);
if (parent.children) parent.children.push(child);
else parent.children = [child];
});
// Extract the root node.
var root = links[0].source;
function nodeByName(name) {
return nodesByName[name] || (nodesByName[name] = {name: name});
}
});
像这样:
关于javascript - 如何转换为 D3 的 JSON 格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11088303/