Không có khuôn khổ bắt buộc , vì bạn thường có thể xác định lại dữ liệu của mình thông qua các hàm truy cập khác nhau (chẳng hạn như hierarchy.children) và array.map. Nhưng định dạng bạn trích dẫn có lẽ là biểu diễn thuận tiện nhất cho cây vì nó hoạt động với các trình truy cập mặc định.
Câu hỏi đầu tiên là bạn có dự định hiển thị số graph hoặc tree hay không. Đối với biểu đồ, cấu trúc dữ liệu được xác định theo các điều khoản của nodes và links. Đối với cây, đầu vào cho bố trí là nút gốc, có thể có một mảng là child nodes và các nút lá có liên kết value.
Nếu bạn muốn hiển thị biểu đồ và tất cả những gì bạn có là danh sách cạnh, thì bạn sẽ muốn lặp qua các cạnh để tạo ra một loạt các nút và một chuỗi liên kết. Giả sử bạn có một tập tin gọi là "graph.csv":
source,target
A1,A2
A2,A3
A2,A4
Bạn có thể tải tập tin này bằng d3.csv và sau đó tạo ra một mảng các nút và các liên kết:
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});
}
});
Sau đó bạn có thể vượt qua các nút và liên kết đến các bố trí lực lượng để hình dung đồ thị:
Nếu bạn muốn tạo ra một cây thay vào đó, thì bạn sẽ cần thực hiện một dạng chuyển đổi dữ liệu hơi khác để tích lũy các nút con cho mỗi phụ huynh.
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});
}
});
Giống như vậy:
những gì bạn có nghĩa là "danh sách kề"? – jbabey
Tôi nghĩ anh ta có nghĩa là '[(A1, A2), (A2, A3), (A2, A4)] '? – sczizzo
@sczizzo: Vâng, đó là ý tôi! Xin lỗi jbabey. Tôi nên rõ ràng hơn. – Legend