【发布时间】:2023-03-30 17:30:01
【问题描述】:
我是 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 example。
我希望树任意深,即如果 Bart 在我的示例中有孩子,并根据名称相应地累积父/子关系。
我找到了great example of this for Sankey Diagrams,但我还没有找到可缩放树形图的等价物。
有没有办法在Bostock's example 的第 124 行和第 126 行之间插入一些代码,以便为可缩放树形图正确格式化我的数据? (我可以更改 CSV 的布局,但想保留 CSV 格式)。类似这种方法使用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 行附近的 cmets 指示处寻求帮助
- 我设置了一个内联变量来保存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()使用key和values属性而不是Treemap 的预期name和children属性构建树。用于块大小调整的value属性保持不变。
仍然存在的问题
- 它不会随意深入。我正在考虑一种方法来重组我的数据以更好地利用
d3.nest()功能,但还没有尝试过。 - 孩子的名字出现在
undefined。我确信我只是忽略了一些简单的事情,但我主要关心的是让核心功能正常工作,所以我会在有时间的时候稍微破解一下。
注意:我仍在寻求一种简洁且惯用的方法来执行此操作,包括有关如何最好地组织 CSV 以实现任意深度的分层嵌套的建议!
【问题讨论】:
标签: javascript csv d3.js treemap