javascript – 在d3.js中从csv创建树层次结构
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – 在d3.js中从csv创建树层次结构,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2978字,纯文字阅读大概需要5分钟。
内容图文
我已经阅读了类似主题的一些问题,但没有一个答案似乎适用于我的用例(或者我真的很困惑).
我有一个来自数据库的csv文件转储,我想使用此处找到的树形图示例显示数据的层次结构http://mbostock.github.com/d3/ex/cluster.html
我的csv文件如下所示:
groupGenre,basicGenre,value Maps,Atlases (Geographic),10 Catalogs,Auction catalogs,28 No larger group,Academic dissertations,451 No larger group,Account books,1 No larger group,Acrostics,56 No larger group,Addresses,62 No larger group,Advertisements,790 No larger group,Allegories,35 No larger group,Almanacs,3401 No larger group,Alphabets,100 No larger group,Anagrams,4 No larger group,Anthologies,133 No larger group,Anti-slavery literature,1
其中value是该类型中出版的书籍数量.
这是我改编的代码,现在根据以下建议进行修改
它也可以在http://dev.stg.brown.edu/projects/Egan/Vis/tree/tree.html找到
var width = 960,
height = 2000;
var tree = d3.layout.tree()
.size([height, width - 160]);
var diagonal = d3.svg.diagonal()
.projection(function(d) { return [d.y, d.x]; });
var vis = d3.select("#chart").append("svg")
.attr("width", width)
.attr("height", height)
.append("g")
.attr("transform", "translate(40, 0)");
d3.csv("../data/genreNested.csv", function(csv) {
var nodes = tree.nodes(makeTree(csv));
var link = vis.selectAll("path.link")
.data(tree.links(nodes))
.enter().append("path")
.attr("class", "link")
.attr("d", diagonal);
var node = vis.selectAll("g.node")
.data(nodes)
.enter().append("g")
.attr("class", "node")
.attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; })
node.append("circle")
.attr("r", 4.5);
node.append("text")
.attr("dx", function(d) { return d.values ? -8 : 8; })
.attr("dy", 3)
.attr("text-anchor", function(d) { return d.values ? "end" : "start"; })
.text(function(d) { return d.key; });
});
//NEW Function to Build Tree from CSV data
function makeTree(nodes) {
var nodeByGenre = {};
//index nodes by genre in case they are out of order
nodes.forEach(function(d) {
nodeByGenre[d.basicGenre] = d;
});
//Lazily compute children.
nodes.forEach(function(d) {
var groupGenre = nodeByGenre[d.groupGenre];
if (groupGenre.children) groupGenre.children.push(d);
else groupGenre.children = [d]
});
return {"name": "genres", "children": nodes[0]}
}
解决方法:
第一个问题看起来是您正在将函数传递给条目而不是按照the docs所期望的数组.尝试将参数csv传递给entries方法.
function makeTree(csv) {
var data = d3.nest()
.key(function(d) {return d.genre; })
.key(function(d) {return d.groupGenre; })
.entries(csv);
return data;
}
第二个问题是你的makeTree函数没有像tree.nodes那样返回树结构,请参阅docs here.你想用makeTree方法创建一个像下面这样的对象.
var root =
{
"basicGenre": "Maps",
"value" : 5,
"children": [
{
"basicGenre": "Atlases (Geographic)",
"value" : 10
"children": [
{
"basicGenre": "Atlases 1",
"children": []
},
{
"basicGenre": "Atlases 2",
"children": []
}
]
}
]
}
基本上你需要创建一个像heiarchary这样的树,它基于groupGenre和basicGenre,都位于一些包含所有根节点的下面.
您可能还想查看this SO question,因为它处理创建传递给tree.nodes的正确对象.
这是一个使用您更新的代码的工作JSFiddle.
内容总结
以上是互联网集市为您收集整理的javascript – 在d3.js中从csv创建树层次结构全部内容,希望文章能够帮你解决javascript – 在d3.js中从csv创建树层次结构所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。