这与这个问题非常相似:
dc.js - how to create a row chart from multiple columns
许多相同的警告适用 - 无法使用此图表进行过滤(刷),因为每一行都对每个箱形图有贡献。
不同之处在于我们需要所有单独的值,而不仅仅是总和。
我没有要测试的示例,但希望这段代码可以工作:
function column_values(dim, cols) {
var _groupAll = dim.groupAll().reduce(
function(p, v) { // add
cols.forEach(function(c) {
p[c].splice(d3.bisectLeft(p[c], v[c]), 0, v[c]);
});
return p;
},
function(p, v) { // remove
cols.forEach(function(c) {
p[c].splice(d3.bisectLeft(p[c], v[c]), 1);
});
return p;
},
function() { // init
var p = {};
cols.forEach(function(c) {
p[c] = [];
});
return p;
});
return {
all: function() {
// or _.pairs, anything to turn the object into an array
return d3.map(_groupAll.value()).entries();
}
};
}
与行图问题一样,我们需要使用 groupAll 将所有数据分组到一个 bin 中 - 普通的交叉过滤 bin 不起作用,因为每一行都对每个 bin 都有贡献。
init 函数创建一个对象,该对象将以列名作为键。每个条目都是该列中值的数组。
add 函数遍历所有列并将每列的值按排序顺序插入到每个数组中。
remove 函数使用二进制搜索找到值并将其删除。
当.all() 被调用时,{key,value} 对将从对象构建。
column_values 函数的第一个参数采用维度或交叉过滤器对象,第二个参数采用列名数组。它返回一个fake group,每个客户端都有一个bin,其中键是客户端名称,值是该客户端按排序顺序排列的所有值。
你可以像这样使用column_values:
var boxplotColumnsGroup = column_values(cf, ['client_1', 'client_2', 'client_3', 'client_4']);
boxPlot
.dimension({}) // no valid dimension as explained in earlier question
.group(boxplotColumnsGroup);
如果这不起作用,请附上一个示例,以便我们一起调试。