我不认为在crossfilter或dc.js中有这样的自动方法。但是如果您愿意推出自己的维度包装器,则可以提供该维度包装器而不是原始维度对象,并将其转发给所有基础维度。
编辑:基于下面@亚拉文的小提琴,这里是一个“维镜”这样的作品,至少在这个简单的例子:
function mirror_dimension() {
var dims = Array.prototype.slice.call(arguments, 0);
function mirror(fname) {
return function(v) {
dims.forEach(function(dim) {
dim[fname](v);
});
};
}
return {
filter: mirror('filter'),
filterExact: mirror('filterExact'),
filterRange: mirror('filterRange'),
filterFunction: mirror('filterFunction')
};
}
它使用这个有点凌乱。对于你想从crossfilter A到镜像到crossfilter B中的每个层面,你需要创建crossfilter B上镜的尺寸,反之亦然:
// Creating the dimensions
subject_DA = CFA.dimension(function(d){ return d.Subject; });
name_DA = CFA.dimension(function(d){ return d.Name; });
// mirror dimensions to receive events from crossfilter B
mirror_subject_DA = CFA.dimension(function(d){ return d.Subject; });
mirror_name_DA = CFA.dimension(function(d){ return d.Name; });
subject_DB = CFB.dimension(function(d){ return d.Subject; });
name_DB = CFB.dimension(function(d){ return d.Name; });
// mirror dimensions to receive events from crossfilter A
mirror_subject_DB = CFB.dimension(function(d){ return d.Subject; });
mirror_name_DB = CFB.dimension(function(d){ return d.Name; });
现在你绑在一起时,鱼目混珠的图表:
// subject Chart
subjectAChart
.dimension(mirror_dimension(subject_DA, mirror_subject_DB))
// ...
// subject Chart
subjectBChart
.dimension(mirror_dimension(subject_DB, mirror_subject_DA))
// ...
nameAChart
.dimension(mirror_dimension(name_DA, mirror_name_DB))
// ...
nameBChart
.dimension(mirror_dimension(name_DB, mirror_name_DA))
// ...
由于所有的图表都implicitly on the same chart group,重绘事件将自动获得它们之间的传播,他们被过滤的时候。并且每个交叉过滤器上的每个过滤器操作都将应用到另一个交叉过滤器上的镜像尺寸。
也许不是我想建议这样做,但像往常一样,它可以使工作。
这里的小提琴:https://jsfiddle.net/gordonwoodhull/7dwn4y87/8/
我与两个数据集有相同的情况进行比较。如果我点击数据集1中的一个项目,它将在数据集2图表中反映相同。你能否告诉我一个更好的方法来处理这个问题。 –
这是我所知道的最好的方式,除了@ Ethan的建议将数据组合成一个交叉过滤器(以便它成为数据问题而不是逻辑问题)。你试过这个吗?它是如何失败的? – Gordon
https://jsfiddle.net/caravinden/y8tts7eo/ @Gordon在这个例子中,我怎样才能同步两个图形之间的点击事件? –