d3.js:分区布局不传播到叶子

时间:2014-12-05 09:43:36

标签: d3.js

我试图转换一个看起来像这样的JSON对象数组(称为dataset): enter image description here

...首先是一个汇总版本(音乐类型为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);

这样可以正常工作,如下所示: enter image description here

接下来,我尝试使用d3.layout.partition()depthxy等传播到根节点(dataset数组本身)和所有的叶子(每个tag /流派对象及其艺术家的子叶)。这是我使用的代码:

            var partition = d3.layout.partition()
                .sort(null)
                .size([2*Math.PI, radius*radius])
                .value(function(d) { 
                    return 1; 
                }); 

但是当我用console.log(partition(dataset))测试时,我得到了这个:

enter image description here

正如您所看到的,partition内容仅传播到数据的最高级别:我得到depth 0和xy值,等,但在我的任何音乐流派或艺术家的作品中,我都没有看到任何depthxy等。

最终目标是制作一个sunburst visualization,其中内圈是流派,外圈是艺术家。我可以只用一个铃声(用于流派)进行可视化,完全绕过partition。但现在我被卡住了。任何帮助一如既往地受到赞赏。

1 个答案:

答案 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]},
    ]
  }
]
}