我试图转换一个看起来像这样的JSON对象数组(称为dataset
):
...首先是一个汇总版本(音乐类型为key
),然后是d3.layout.partition()
。我在第二步遇到了麻烦。要rollup
数据,我使用以下代码
//Organizing data by genre/tag
dataset = d3.nest()
.key(function(d) { return d.tag; })
.sortValues(function(a, b) { return parseFloat(b.playcount) - parseFloat(a.playcount); })
.entries(dataset);
这样可以正常工作,如下所示:
接下来,我尝试使用d3.layout.partition()
将depth
,x
,y
等传播到根节点(dataset
数组本身)和所有的叶子(每个tag
/流派对象及其艺术家的子叶)。这是我使用的代码:
var partition = d3.layout.partition()
.sort(null)
.size([2*Math.PI, radius*radius])
.value(function(d) {
return 1;
});
但是当我用console.log(partition(dataset))
测试时,我得到了这个:
正如您所看到的,partition
内容仅传播到数据的最高级别:我得到depth
0和x
,y
值,等,但在我的任何音乐流派或艺术家的作品中,我都没有看到任何depth
,x
,y
等。
最终目标是制作一个sunburst visualization,其中内圈是流派,外圈是艺术家。我可以只用一个铃声(用于流派)进行可视化,完全绕过partition
。但现在我被卡住了。任何帮助一如既往地受到赞赏。
答案 0 :(得分:1)
d3.layout.partition通过查找children
属性
使用默认设置创建新的分区布局:默认排序顺序是降序值;默认值访问器假定每个输入数据是一个具有数值属性的对象; 默认的子访问器假设每个输入数据都是带有子数组的对象;默认大小为1×1。
过了一会儿:
首先为层次结构中的根节点调用子访问器。如果访问器返回null,则假定该节点是叶节点,并且布局遍历终止。否则,访问器应返回表示子节点的数据元素数组。
因此,对于您的嵌套对象,分区在根节点中看不到任何children
属性,并确定它是叶子。
您可以更改children accessor function以适应您的结构,或者如果您想使用默认参数,则应该使您的结构如下:
{
'name': 'root'
'children': [
{
'name': 'rock',
'children': [
{'name': 'Pink Floyd', 'playcount': 319, [otherstuff]},
{'name': 'Rock artist 2', 'playcount': 200, [otherstuff]},
]
},
{
'name': 'blues',
'children': [
{'name': 'Blues artis 1', 'playcount': 25, [otherstuff]},
]
}
]
}