我一直在尝试使用刷子的rangechart滤清器,以便与系列设施一起使用。主要图表似乎没有响应过滤器。我以系列为例。
var chart = dc.seriesChart("#test");
var overviewChart = dc.seriesChart("#test-overview");
var ndx, runDimension, runGroup, overviewRunDimension, overviewRunGroup;
var experiments = d3.csv.parse(d3.select("pre#data").text());
ndx = crossfilter(experiments);
runDimension = ndx.dimension(function(d) {return [+d.Expt, +d.Run]; });
overviewRunDimension = ndx.dimension(function(d) {return [+d.Expt, +d.Run]; });
runGroup = runDimension.group().reduceSum(function(d) { return +d.Speed; });
overviewRunGroup = overviewRunDimension.group().reduceSum(function(d) { return +d.Speed; });
chart
.width(768)
.height(480)
.chart(function(c) { return dc.lineChart(c).interpolate('basis'); })
.x(d3.scale.linear().domain([0,20]))
.brushOn(false)
.yAxisLabel("Measured Speed km/s")
.xAxisLabel("Run")
.clipPadding(10)
.elasticY(true)
.dimension(runDimension)
.group(runGroup)
.mouseZoomable(true)
.rangeChart(overviewChart)
.seriesAccessor(function(d) {return "Expt: " + d.key[0];})
.keyAccessor(function(d) {return +d.key[1];})
.valueAccessor(function(d) {return +d.value - 500;})
.legend(dc.legend().x(350).y(350).itemHeight(13).gap(5).horizontal(1).legendWidth(140).itemWidth(70));
chart.yAxis().tickFormat(function(d) {return d3.format(',d')(d+299500);});
chart.margins().left += 40;
overviewChart
.width(768)
.height(100)
.chart(function(c) { return dc.lineChart(c).interpolate('basis'); })
.x(d3.scale.linear().domain([0,20]))
.brushOn(true)
.xAxisLabel("Run")
.clipPadding(10)
.dimension(overviewRunDimension)
.group(overviewRunGroup)
.seriesAccessor(function(d) {return "Expt: " + d.key[0];})
.keyAccessor(function(d) {return +d.key[1];})
.valueAccessor(function(d) {return +d.value - 500;})
dc.renderAll();
它证明了我遇到的问题。有任何建议吗?
Note :该问题已在DC.JS V3中修复,因为复合图现在拥有刷子并正确过滤了孩子。以下仅与DC.JS V2有关 好吧,我有点奏效,有一些丑陋的代码。这里的一般问题是,DC.JS图表没有一种在实例之间共享刷子的方法,因此一般的复合刷牙(其中有很多实例)的工作状况不佳。 特别是,这是串联图表的问题。对于任何有兴趣的人来说,偶数特定的焦点系列图表都在这里。 如果您只想让某些事情有效,这是我想到的一个非常可怕的解决方法。 首先,一件事不是解决方法。您始终希望使用相同的维度和组来进行焦点和范围图表。这是因为您不希望他们互相过滤:它们是相同数据的视图,并且从逻辑上共享刷子。 所以我做到了: 某人在某个时候试图通过不过滤复合图表来解决复合过滤问题,而是将过滤器传递给其子女。因此,如果您在一个孩子上捕获过滤事件,并且在过滤时进行范围图表通常会做的事情,则将获得所需的行为。 这是真的很丑陋的地方: "工作"小提琴的叉子。我将"工作"引用为"工作"是因为存在一个问题,即图表边界上的点没有被渲染,这会导致这里荒谬的过渡。 但有点有效。overviewChart
.dimension(runDimension)
.group(runGroup)
overviewChart
.chart(function(c,_,_,i) {
var chart = dc.lineChart(c).interpolate('basis');
if(i===0)
chart.on('filtered', function (chart) {
if (!chart.filter()) {
dc.events.trigger(function () {
overviewChart.focusChart().x().domain(overviewChart.focusChart().xOriginalDomain());
overviewChart.focusChart().redraw();
});
} else if (!rangesEqual(chart.filter(), overviewChart.focusChart().filter())) {
dc.events.trigger(function () {
overviewChart.focusChart().focus(chart.filter());
});
}
});
return chart;
})
on('filtered', ...)
的内容几乎是从rangechart的坐标网格图中批发出来的。