我过去几周一直在使用dc.js,但有一个问题,我似乎无法搞清楚.
我希望能够使用画笔滤镜更改基于单个图表的四个不同图表的比例.有点像:
priorityTotChart
.width(2*w/3).height(h/3)
.margins({top: 10, right: 50, bottom: 20, left: 40})
.dimension(dateDim)
.group(priorityTotal)
.centerBar(true)
.gap(1)
.x(d3.time.scale().domain([minDate,maxDate]))
.elasticY(true)
.brushOn(true);
var translate = 3;
priority1Chart.width(w/3)
.height(h/6)
.transitionDuration(300)
.margins({top: 10, right: 50, bottom: 25, left: 40})
.dimension(dateDim)
.group(priority1)
.mouseZoomable(false)
.x(d3.time.scale().domain([minDate,maxDate]))
.xUnits(d3.time.months)
.elasticY(true)
.brushOn(false)
.ordinalColors(["red"])
.rangeChart(priorityTotChart)
.yAxisLabel("Hits per day")
.renderArea(true)
.renderlet(function (chart) {
chart.selectAll("g._1").attr("transform", "translate(" + translate + ", 0)");
});
priority2Chart.width(w/3)
.height(h/6)
.transitionDuration(300)
.margins({top: 10, right: 50, bottom: 25, left: 40})
.dimension(dateDim)
.group(priority2)
.mouseZoomable(false)
.x(d3.time.scale().domain([minDate,maxDate]))
.xUnits(d3.time.months)
.elasticY(true)
.brushOn(false)
.ordinalColors(["orange"])
.rangeChart(priorityTotChart)
.yAxisLabel("Hits per day")
.renderArea(true)
.renderlet(function (chart) {
chart.selectAll("g._1").attr("transform", "translate(" + translate + ", 0)");
});
priority3Chart.width(w/3)
.height(h/6)
.transitionDuration(300)
.margins({top: 10, right: 50, bottom: 25, left: 40})
.dimension(dateDim)
.group(priority3)
.mouseZoomable(false)
.x(d3.time.scale().domain([minDate,maxDate]))
.xUnits(d3.time.months)
.elasticY(true)
.brushOn(false)
.ordinalColors(["blue"])
.rangeChart(priorityTotChart)
.yAxisLabel("Hits per day")
.renderArea(true)
.renderlet(function (chart) {
chart.selectAll("g._1").attr("transform", "translate(" + translate + ", 0)");
});
priority4Chart.width(w/3)
.height(h/6)
.transitionDuration(300)
.margins({top: 10, right: 50, bottom: 25, left: 40})
.dimension(dateDim)
.group(priority4)
.mouseZoomable(false)
.x(d3.time.scale().domain([minDate,maxDate]))
.xUnits(d3.time.months)
.elasticY(true)
.brushOn(false)
.ordinalColors(["green"])
.rangeChart(priorityTotChart)
.yAxisLabel("Hits per day")
.renderArea(true)
.renderlet(function (chart) {
chart.selectAll("g._1").attr("transform", "translate(" + translate + ", 0)");
});
Run Code Online (Sandbox Code Playgroud)
但是,此方法似乎不起作用,因为只会.rangeChart(priorityTotChart)更新使用的最后一个图表.
我可以通过使每个图依赖于前一个图的范围来解决这个问题,即priority1Chart具有.rangeChart(priorityTotChart),而priority2Chart具有.rangeChart(priority1Chart)等等,但是这种方法非常慢.所以我希望有更好的方法来达到同样的效果?
提前致谢!
提出问题的另一种方式是,“如何将多个焦点图表附加到单个范围图表?”
(至少,如果您只关心刷范围图缩放焦点图,而不是相反。)
鉴于这个新问题,看一下coordinateGridMixin.focusChart 的实现:
_chart.focusChart = function (c) {
if (!arguments.length) {
return _focusChart;
}
_focusChart = c;
_chart.on('filtered', function (chart) {
if (!chart.filter()) {
dc.events.trigger(function () {
_focusChart.x().domain(_focusChart.xOriginalDomain());
});
} else if (!rangesEqual(chart.filter(), _focusChart.filter())) {
dc.events.trigger(function () {
_focusChart.focus(chart.filter());
});
}
});
return _chart;
};
Run Code Online (Sandbox Code Playgroud)
我们在这里需要做的就是制作一个新版本的函数,该函数采用多个焦点图表。由于这个函数不访问任何内部数据,我们可以“猴子补丁”任何坐标网格图来添加功能:
chart1.focusCharts = function (chartlist) {
if (!arguments.length) {
return this._focusCharts;
}
this._focusCharts = chartlist; // only needed to support the getter above
this.on('filtered', function (range_chart) {
if (!range_chart.filter()) {
dc.events.trigger(function () {
chartlist.forEach(function(focus_chart) {
focus_chart.x().domain(focus_chart.xOriginalDomain());
});
});
} else chartlist.forEach(function(focus_chart) {
if (!rangesEqual(range_chart.filter(), focus_chart.filter())) {
dc.events.trigger(function () {
focus_chart.focus(range_chart.filter());
});
}
});
});
return this;
};
Run Code Online (Sandbox Code Playgroud)
我们还需要从coordinateGridMixin 中复制rangesEqual 辅助函数以使其正常工作。
我创建了一个示例并将其添加到 dc.js 示例中:
http://dc-js.github.io/dc.js/examples/multi-focus.html
你可以在这里看到源:
https://github.com/dc-js/dc.js/blob/master/web/examples/multi-focus.html
这会很好地支持本机,包括相反的情况缩放 -> 过滤器,这确实需要更改 dc.js 内部。我添加了一个问题来跟踪这个想法:https : //github.com/dc-js/dc.js/issues/820