Search code examples
dc.jscrossfilterreductio

dc.js boxplot b.map(...).sort is not a function


I am trying to generate box plot. After creating dimension and group I've followed the example given at https://github.com/dc-js/dc.js/blob/master/web/examples/box-plot.html

I'm using reductio to make the reductions easier:

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);

I'm also using a valueAccessor for my group:

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

I'm getting this error:

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

I've added a fiddle to replicate this issue. https://jsfiddle.net/momhzyxp/7/

Cheers


Solution

  • Instead of using reductio to aggregate the values into sums, you can use reductio.dataList to produce arrays of the original rows that fall into each bin:

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

    Then, assuming you want to divide each ta by each nc (not sure what you are trying to do here), the valueAccessor looks like:

      .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;
      })
    

    (or you can do whatever you like with each v.ta and v.nc).

    Fork of your fiddle: https://jsfiddle.net/oawbzdgy/11/