单击行图(dc.js)可更改百分比

时间:2017-03-24 13:00:54

标签: dc.js crossfilter

我需要解决dc和crossfilter的问题,我有两个行图,其中我将每行的计算百分比显示为:

          (d.value/ndx.groupAll().reduceCount().value()*100).toFixed(1)

当您单击第一个图表中的某一行时,文本将更改为100%并且不会保留旧的百分比值,同时选择行的同一图表的行的百分比也会更改。

单击?时是否可以保留原始百分比?,影响未点击的其他图形。

问候 非常感谢你

1 个答案:

答案 0 :(得分:0)

首先,您可能不想在百分比计算中调用ndx.groupAll(),因为这将被多次调用。此方法创建一个对象,每次过滤器更改时都会更新。

现在,有三种方法可以解释您的具体问题。我认为第一种情况最有可能,但其他两种情况也是合法的,所以我会解决这三种情况。

受其他图表影响的百分比

显然,您不希望通过过滤当前图表来影响百分比。 You almost never want that.但是通过在其他图表上过滤来影响百分比标签通常是有意义的,因此行图中的所有条形加起来都是100%。

dimension.groupAll()crossfilter.groupAll()之间的细微差别是前者不会观察到维度过滤器,而后者会观察所有过滤器。如果我们使用行图维度groupAll,它会在此图表中观察其他过滤器,但不会过滤:

var totalGroup = rowDim.groupAll().reduceCount();
rowChart.label(function(kv) {
  return kv.key + ' (' + (kv.value/totalGroup.value()*100).toFixed(1) + '%)';
});

这可能是你想要的,但从字面上阅读你的问题可以提出另外两个可能的答案。如果那不是你想要的,请继续阅读。

常数总和中的百分比,但受其他过滤器的影响

Crossfilter没有任何特定的方法来计算未过滤的总数,但如果想要使用未过滤的总数,我们可以在应用任何过滤器之前捕获该值。

所以:

var total = rowDim.groupAll().reduceCount().value;
rowChart.label(function(kv) {
  return kv.key + ' (' + (kv.value/total*100).toFixed(1) + '%)';
});

在这种情况下,百分比将始终显示完整的,未过滤的总分母中的部分,但分子将反映其他图表上的过滤器。

不受过滤

影响的百分比

如果您真的想要完全冻结百分比并显示未经过滤的百分比,而不受任何过滤的影响,我们将不得不做一些额外的工作来捕获这些值。

(这类似于你想要展示"阴影"后面未过滤的酒吧所需要做的事情。)

我们会将所有群组数据复制到我们可用于查找值的地图中:

var rowUnfilteredAll = rowGroup.all().reduce(function(p, kv) {
  p[kv.key] = kv.value;
  return p;
}, {});

现在标签代码与之前类似,但我们查找值而不是从绑定数据中读取它们:

var total = rowDim.groupAll().reduceCount().value;
rowChart.label(function(kv) {
  return kv.key + ' (' + (rowUnfilteredAll[kv.key]/total*100).toFixed(1) + '%)';
});

(可能有一种更简单的方法来冻结标签,但这是我想到的。)