从d3.layout.pie()

时间:2016-01-15 23:13:51

标签: d3.js

我正在从JSON文件创建饼图。我想知道是否有一种方法可以从JSON文件中获取一些名称,并将它们指定为d3.layout.pie()创建的弧的类名。

以下是我创建的示例:http://blockbuilder.org/jinlong25/532d889e01d02cef2d24

基本上,我想做下面最后一行代码:

var data = [
  {
    'name': 'apple',
    'value': 250
  },
  {
    'name': 'banana',
    'value': 100
  },
  {
    'name': 'orange',
    'value': 150
  }
];

var arcs = svg.selectAll('g.arc')
              .data(pie(data.map(function(d) { return d.value; })))
              .enter().append('g')
              .attr('transform', 'translate(70, 70)')
              .attr('class', function(d) { return d.name; };

但是由于数据已经被pie()转换,我想知道是否还有为class()生成的数据添加类名。

谢谢!

2 个答案:

答案 0 :(得分:2)

d3的布局有助于提供.value() accessor,它允许您指定获取数据值的方式,而不是执行data.map()操作。所以,你可以这样做:

var pie = d3.layout.pie().value(function(d) { return d.value; })

这样,您的原始数据将保存在d.data中。

因此,使用pie的定义,您的代码将更改为:

var arcs = svg.selectAll('g.arc')
          .data(pie(data))
          .enter().append('g')
          .attr('transform', 'translate(70, 70)')
          .attr('class', function(d) { return d.data.name; };

编辑:添加链接相关文档。

答案 1 :(得分:1)

一些D3布局会改变原始数据集,但其他布局会创建一个新的数据集(如voronoi)。在这些情况下,您可以在使用新数据集时使用原始数据集中的数组位置。所以从你的例子来看:

var arcs = svg.selectAll('g.arc')
          .data(pie(data.map(function(d) { return d.value; })))
          .enter().append('g')
          .attr('transform', 'translate(70, 70)')
          .attr('class', function(d,i) { return data[i].name; };