【问题标题】:custom ordering in custom reduce functions in dc.js crossfilter.jsdc.js crossfilter.js中自定义reduce函数中的自定义排序
【发布时间】:2016-04-07 10:10:08
【问题描述】:

我有以下自定义reduce函数

  function reduceAdd(p, v) {
  p.vol_t += v.oqt;
  p.prc_t += v.it;
  ++p.count;
  // p.average = d3.round((p.total / p.count), 2);
  return p;
}

function reduceRemove(p, v) {
  p.vol_t -= v.oqt;
  p.prc_t -= v.it;
  --p.count;
  // p.average = d3.round((p.total / p.count), 2);
  return p;
}

function reduceInitial() {
  return {
    vol_t:  0.0,
    prc_t:  0.0,
    count:  0,
  };
}

我的数据模型如下:

    [{cat:'a', oqt:23.0, it: 45.0},
    {cat:'b', oqt:25.0, it: 5.0}, 
    {cat:'b', oqt:22.0, it: 25.0},
    {cat:'c', oqt:17.0, it: 35.0}]

我正在尝试使用 dc.js 绘制气泡图,其中 vol_t 作为 X(keyAccessor),prc_t 作为 Y 轴(valueAccessor)并计为 radiusAcessor。如何找到所有组的最大值和最小值。我的组基于类别“猫”维度。

谢谢!

【问题讨论】:

    标签: d3.js dc.js crossfilter reductio


    【解决方案1】:

    您可以根据组的值为组定义任意排序:https://github.com/crossfilter/crossfilter/wiki/API-Reference#group_order

    但是,如果您使用的是 dc.js 气泡图,我认为没有必要定义任何特定的顺序。您只需要定义正确的访问器。

    【讨论】:

    • 我需要它用于我的轴的域和范围。我在想我想计算最大值,最小值,按 top(1)[0] 排序。因此,对于 X 轴,我必须按数量订购,对于 Y 轴,我必须按价格订购。
    • 如果您希望设置一次域,那么您不想为此使用 Crossfilter。只需将数据转换为数字列表(使用 Array.map)并使用 Math.min 和 Math.max。或者,如果您愿意,可以使用 d3.extent。如果您使用的是 elasticX/elasticY,那么我认为 dc.js 会为您处理这个问题。
    【解决方案2】:

    通过使用 d3.extent 并传递类别组和访问器函数返回数量和价格来解决它。

    【讨论】:

      猜你喜欢
      • 2020-03-15
      • 1970-01-01
      • 2018-10-09
      • 2021-08-04
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多