Ответ 1
Нет предписанного формата, поскольку вы обычно можете переопределять свои данные с помощью различных функций доступа (например, hierarchy.children) и array.map. Но формат, который вы цитируете, является, пожалуй, наиболее удобным представлением для деревьев, поскольку он работает с аксессуарами по умолчанию.
Первый вопрос: планируете ли вы отображать график или tree. Для графиков структура данных определяется в терминах nodes и links. Для деревьев вход в макет - это корень node, который может иметь массив дочерних узлов, а его листовые узлы связаны с 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});
}
});
Так же: