javascript - 如何减少 Crossfilter 组函数创建的存储桶数量?

标签 javascript crossfilter

默认情况下,在 Crossfilter 维度上创建 Crossfilter 组时,组的大小将等于维度中唯一值的数量。例如,如果我这样做:

var array = [1,1,1,2,2,2,3,3,4,5,5,6,6,7];
var dimension = crossfilter.dimension(array);
var group = crossfilter.group(dimension);
// group.size() will equal 7, as group is a representation of dimension's unique values

这对于创建直方图和显示维度的分布很有用。

但是,如果您有数百个唯一值,则使用该组作为直方图就变得不太实用,因为您的直方图条对于您拥有的 View 框架来说变得太小,或者太小而无法被观看者辨别(并且与在 Crossfilter 示例中,我使用矩形而不是路径来更好地控制颜色)。

我想减少 crossfilter.group(dimension) 创建的可能存储桶的数量,以便将具有唯一值的存储桶相互折叠。

例如,如果我有一个包含 300 个唯一值存储桶的组,我希望能够将该数字减少到 20 个(现在假设均匀拆分),其中原始 300 个值的前 15 个值被折叠放入一个桶中,接下来的 15 个放入另一个桶中,依此类推,直到从最初的 300 个桶中只创建了 20 个桶。

我只需使用 javascript 就可以轻松完成此操作,但我需要将表示形式粘贴到交叉过滤器对象上。有没有办法用交叉过滤器方法来做到这一点?

最佳答案

我使用了一些类似的东西:

var array = [1,1,1,2,2,2,3,3,4,5,5,6,6,7];
var ndx = crossfilter(array);
var scale = d3.scale.quantize().domain([0, 10]).range(d3.range(1, 4));
var dimension = ndx.dimension(function(d) { return scale(d); });
// or, more concisely:
var dimension = ndx.dimension(scale);
var group = dimension.group();

这将创建一个 scale 函数,将域映射到范围,并根据需要进行“舍入”。请参阅quantize scale .

请注意,域和范围不包括最大值,因此:

scale(0)  // 1
scale(9)  // 3

dimension然后可以创建使用此重新映射函数,并且 group会统计它们。

group.all()的结果是:

[{key: 1, value: 8}, {key: 2, value: 5}, {key: 3, value: 1}]

您可能需要将 key 转换回原始域,以用于直方图上的刻度/标签或其他内容,您可以使用 scale.invertExtent为此:

scale.invertExtent(1)  // [0, 3.33..]
scale.invertExtent(2)  // [3.33.., 6.66..]
scale.invertExtent(3)  // [6.66.., 10]

关于javascript - 如何减少 Crossfilter 组函数创建的存储桶数量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20111567/

相关文章:

javascript - Angular 2 服务变量在模板中引用时给出控制台错误

javascript - Firestore:更新嵌套对象中的字段

javascript - 在循环数组时发出 json 请求和存储值的正确方法是什么?

javascript - 如何使用 dc.js 在饼图中心显示值

javascript - filterAll() 和 dc.redrawAll() 不适用于 dc.pieChart

javascript - 具有 ID 的 DOM 树元素是否成为全局属性?

javascript - 更改当前选定字段的颜色

crossfilter - Crossfilter 组函数的奇怪行为

javascript - Dc.Js 行图删除空箱

javascript - 如何排序以从 "crossfilter-reduce-find-number-of-uniques"中获取前 10 名