获得复杂归约的前 n 个

Getting Top n Of Complex Reduce

我想我遗漏了一些明显的东西。 使用 DC.JS 的数据table 实现:

  var salesExpenseByCompany = dc.dataTable("#salesExpenseByCompany");

  var salesExpenseDim = facts.dimension(function (d) {
    return d.client;
  });

  function reduceAdd(i, d) {
    i.sales = i.sales + d.sales;
    i.expenses = i.expenses + d.expenses;
    return i;
  }
  function reduceRemove(i, d) {
    i.sales = i.sales - d.sales;
    i.expenses = i.expenses - d.expenses;
    return i;
  }

  function reduceInitial(i, d) {
    return {
      sales: 0,
      expenses: 0,
    };
  }

这当然是 returns 一个新对象,对数据中的每个 属性 求和。

 [
    {'key':'B','value':{'sales':1544,'expenses':478}},
    {'key':'C','value':{'sales':2781,'expenses':1354}},
    {'key':'D','value':{'sales':1196,'expenses':987}},
    {'key':'E','value':{'sales':1156,'expenses':622}},
    {'key':'F','value':{'sales':1778,'expenses':1208}},
    {'key':'G','value':{'sales':666,'expenses':55}},
    {'key':'A','value':{'sales':2318,'expenses':801}}
]

当我将它加载到数据中时table,我想要排名前 10 或 25 或 50 的销售额(通过按钮设置),但我不确定如何获得它。我希望将它们降序排列。这是我目前所拥有的:

    .dimension(salesExpenseGr)
.size(4)
    .order(d3.descending)
    .sortBy(function (d) {
      return d.value.sales;
    })
    .columns([
      {
        label: "Company Name",
        format: function (d) {
          return d.key;
        },
      },
      {
        label: "Sales",
        className: "text-right",
        format: function (d) {
          return numFormat(d.value.sales);
        },
      },
      {
        label: "Expenses",
        className: "text-right",
        format: function (d) {
          return numFormat(d.value.expenses);
        },
      },
    ]);

.size() 选项似乎首先取维度的前四个,然后按适当的列对这 4 个进行排序。

.size(4)

.size()

公司F应该是在table的时候,尺寸限制在4个

那我错过了什么?我怀疑这与 .top() 选项有关,但我不确定将它放在哪里。

https://codepen.io/jlbmagic/pen/WNxGWXZ

参见随附的 Codepen。

谢谢!

分组排序通常应与数据排序一致table:

  var salesExpenseGr = salesExpenseDim
    // ...
    .order(({sales}) => sales);

我认为如果您使用简单的归约,该组将按照您的预期进行排序。但是 crossfilter 不知道如何对对象进行排序,因此排序不会发生,bin 将按字母顺序按键保留。

如果排序一致,则包含 F 而不是 D:

(F的值在你的笔和你的截图之间是不同的。)

Fork of your codepen.

历史记录

问为什么 dc.js 有这样的脚枪是有道理的。这与图书馆的发展有关。早期,dc.js 尝试尽可能使用 crossfilter 的功能,因此 .size() 使用 dimension.top()(这里是 group.top())。但后来,人们发现他们想要以仅使用交叉过滤器对象不可能实现的方式对数据进行排序,因此 .sortBy() 被添加到数据 table(以及 .ordering() 用于其他图表)。

由于这个原因,行图和饼图等封顶图表已停止使用 .top(),但数据 table 从未被清理过。