我是使用 D3 的新手,我觉得它非常谦虚。
我的目标是从 CSV 文件制作树状图。我想使用 CSV 格式,因为我将使用电子表格中的值,而且我很容易以这种方式保存文件。
我正在尝试以分层格式存储数据,如下所示(hier.csv):
parent,child,value
Homer Simpson,Bart,20
Homer Simpson,Lisa,14
Homer Simpson,Maggie,6
Peter Griffin,Chris,19
Peter Griffin,Meg,12
Peter Griffin,Stewie,9
我正在使用这个Zoomable Treemap 示例。
我希望树可以任意深入,即如果 Bart 在我的示例中有孩子,并根据名称相应地累积父/子关系。
我为 Sankey Diagrams 找到了一个很好的例子,但我还没有找到 Zoomable Treemaps 的等价物。
有没有办法在Bostock 示例的第 124 行和第 126 行之间插入一些代码,以便为可缩放树形图正确格式化我的数据?(我可以更改 CSV 的布局,但想保留 CSV 格式)。类似这种方法 using nest()
,但显然这不起作用:
d3.csv("./hier.csv", function(hier) {
var root = {
"name": "myrootnode",
"children": d3.nest()
.key(function (d) { return d.parent; })
.key(function (d) { return d.child; })
.entries(hier)
};
initialize(root);
accumulate(root);
layout(root);
display(root);
//etc...
我看到了一些例子和 StackOverflow 问题,这些问题解决了这个问题,但无法将它们端到端地结合在一起。而且我一直在研究和破解无济于事。我会欢迎一些帮助。谢谢!
在这里提琴
小提琴笔记:
- 我在评论指出的第 90 行附近寻求帮助
- 我设置了一个内联变量来保存flare.json的精简副本
- 我计划在现实生活中将数据保存在一个单独的文件中,但对于 JSFiddle,它必须内联;当然,如果我能弄清楚主要逻辑,这将很容易适应单独的数据文件。
- 此示例似乎不适用于 D3 版本 3.0.4,这是 JSFiddle 的当前内置版本。我为示例导入了 v2.x,因为这适用于 Bostock 的示例。这是一个潜在的单独问题......
更新
我克服了部分问题。我的想法并没有太远,这nest()
是必要的,但我没有正确更新我的访问器。这是一个非常草率的看一些最有效的东西:http:
//bl.ocks.org/maw246/7303963
我的示例和 Bostock 示例之间的主要区别:
- CSV 在加载后被嵌套,使用
d3.nest()
. 这将其强制转换为分层 JSON 对象格式 - 许多(如果不是全部)对“children”的引用已被“values”取代,因为使用和属性
d3.nest()
构建树,而不是 Treemap 的预期和属性。用于块大小调整的属性保持不变。key
values
name
children
value
遗留问题
- 它不会随意深入。我正在考虑一种方法来重组我的数据以更好地利用该
d3.nest()
功能,但还没有尝试过。 - 孩子们的名字出现了
undefined
。我确定我只是忽略了一些简单的事情,但我主要关心的是让核心功能正常工作,所以我会在有时间的时候稍微破解一下这篇文章。
注意:我仍在寻求一种干净且惯用的方法来执行此操作,包括有关如何最好地组织 CSV 以实现任意深度的分层嵌套的建议!