dc.js boxplot b.map(...)。排序不是一个函数

时间:2017-07-12 07:05:32

标签: dc.js crossfilter reductio

我正在尝试生成盒子图。创建维度和组后,我按照给出的示例进行了操作 https://github.com/dc-js/dc.js/blob/master/web/examples/box-plot.html

我正在使用reductio来简化缩减:

var ndx = crossfilter(ds);
var skuDim = ndx.dimension(function(d){ return d.sku; });
var skuGroup = skuDim.group();

var reducer = reductio();
reducer
  .value('_nc')
  .sum(function(d){
      return d.nc;
  });
reducer
  .value('_ta')
  .sum(function(d){
      return d.ta;
  });

reducer(skuGroup);

我也在为我的小组使用valueAccessor:

  .valueAccessor(function(p){
    return p.value._nc.sum ? Math.round(p.value._ta.sum / p.value._nc.sum * 100) / 100 : 0;
  })

我收到了这个错误:

TypeError: b.map(...).sort is not a function.

我添加了一个小提琴来复制这个问题。 https://jsfiddle.net/momhzyxp/7/

干杯

1 个答案:

答案 0 :(得分:1)

您可以使用reductio.dataList生成落入每个bin的原始行数组,而不是使用reductio将值聚合为和:

var reducer = reductio();
reducer
  .value('_rows')
  .dataList(true);

reducer(skuGroup);

然后,假设您想要将每个 ta除以每个 nc(不确定您在此处尝试做什么), valueAccessor看起来像:

  .valueAccessor(function(p){
    var values = p.value._rows.dataList.map(function(v, i) {
      return v.nc ? Math.round(v.ta / v.nc * 100) / 100 : 0;
    });
    return values;
  })

(或者您可以对每个v.tav.nc执行任何操作。

你小提琴的叉子:https://jsfiddle.net/oawbzdgy/11/