单击行图 (dc.js) 更改百分比
Clicking on rowchart (dc.js) changes the percentage
我需要解决 dc 和 crossfilter 的问题,我有两个行图,其中我将每行的计算百分比显示为:
(d.value/ndx.groupAll().reduceCount().value()*100).toFixed(1)
当您单击第一个图表中的一行时,文本变为 100% 并且不会保持旧的百分比值,而且选中该行的同一图表中各行的百分比也会发生变化。
是否可以在点击时保持原来的百分比?影响其他未点击的图形
问候
非常感谢
首先,您可能不想在百分比计算中调用 ndx.groupAll()
,因为它会被调用很多次。此方法创建一个对象,每次过滤器更改时都会更新该对象。
现在,可以通过三种方式来解释您的具体问题。我认为第一种情况最有可能,但其他两种情况也是合法的,所以我将解决这三种情况。
受其他图表影响的百分比
显然您不希望过滤当前图表影响百分比。 You almost never want that. 但在其他图表上过滤影响百分比标签通常是有意义的,因此行图表中的所有条形加起来为 100%。
dimension.groupAll() and 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) + '%)';
});
在这种情况下,百分比将始终显示未过滤的完整总分母中的部分,但分子将反映其他图表上的过滤条件。
完全不受过滤影响的百分比
如果您真的想完全冻结百分比并显示未过滤的百分比,不受任何过滤的影响,我们将不得不做一些额外的工作来捕获这些值。
(这与您想要显示 "shadow" 个未过滤条形图背后的情况类似。)
我们会将所有组数据复制到地图中,我们可以使用它来查找值:
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) + '%)';
});
(可能有更简单的方法来冻结标签,但这就是我想到的。)
我需要解决 dc 和 crossfilter 的问题,我有两个行图,其中我将每行的计算百分比显示为:
(d.value/ndx.groupAll().reduceCount().value()*100).toFixed(1)
当您单击第一个图表中的一行时,文本变为 100% 并且不会保持旧的百分比值,而且选中该行的同一图表中各行的百分比也会发生变化。
是否可以在点击时保持原来的百分比?影响其他未点击的图形
问候 非常感谢
首先,您可能不想在百分比计算中调用 ndx.groupAll()
,因为它会被调用很多次。此方法创建一个对象,每次过滤器更改时都会更新该对象。
现在,可以通过三种方式来解释您的具体问题。我认为第一种情况最有可能,但其他两种情况也是合法的,所以我将解决这三种情况。
受其他图表影响的百分比
显然您不希望过滤当前图表影响百分比。 You almost never want that. 但在其他图表上过滤影响百分比标签通常是有意义的,因此行图表中的所有条形加起来为 100%。
dimension.groupAll() and 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) + '%)';
});
在这种情况下,百分比将始终显示未过滤的完整总分母中的部分,但分子将反映其他图表上的过滤条件。
完全不受过滤影响的百分比
如果您真的想完全冻结百分比并显示未过滤的百分比,不受任何过滤的影响,我们将不得不做一些额外的工作来捕获这些值。
(这与您想要显示 "shadow" 个未过滤条形图背后的情况类似。)
我们会将所有组数据复制到地图中,我们可以使用它来查找值:
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) + '%)';
});
(可能有更简单的方法来冻结标签,但这就是我想到的。)