我使用一些非常简化的数据来说明这个想法。假设我的数据集是:
var data =
[{type:"cat",row:1, col:1, speed:15},
{type:"cat",row:1, col:2, speed:10},
{type:"cat",row:2, col:1, speed:3},
{type:"cat",row:2, col:2, speed:17},
{type:"dog",row:1, col:1, speed:25},
{type:"dog",row:1, col:2, speed:30},
{type:"dog",row:2, col:1, speed:16},
{type:"dog",row:2, col:2, speed:10}]
我对这些数据有几个维度,例如
var ndx = crossfilter(data);
var mainDim = ndx.dimension(function (d) {
return [+d.row, +d.col];
});
var mainGroup = mainDim.group().reduceSum(function (d) {
return +d.speed;
});
var rowDim = ndx.dimension(function (d) {
return d.row;
});
var rowGroup = rowDim.group();
使用此数据集构建了几个DC.JS图表。
现在的问题是,我想要一种动态生成图表的方法,例如为每个type
生成一个heatMap。我只能通过一个交叉滤波器实例找到一种方法来实现这一点,因此我使用自己的交叉实例,维度,组等创建了过滤数据集。
// Get list of unique types
var types = [];
data.forEach( function(d) {
if( types.indexOf(d.type ) == -1 )
types.push(d.type);
});
// Create new dataset for each type
var filteredData = {};
function checkType(elem, type){
return elem.type == type;
}
types.forEach(function(type){
filteredData[type] = data.filter(function(elem){
return checkType(elem,type);
});
});
var crossfilters = {};
var dims = {};
var grps = {};
types.forEach(function(type){
// Create crossfilter for each type
crossfilters[type] = crossfilter(filteredData[type]);
// Create dimensions & for each type
dims[type] = crossfilters[type].dimension(function (d) {
return [+d.row, +d.col];
});
grps[type] = dims[type].group().reduceSum(function (d) {
return +d.speed;
});
});
我仍然希望用户与图表的交互能够在不同的crossfilter实例之间传播过滤器。有没有办法动态实现这个目标?