dc.js - 如何在多个图表中镜像画笔?
dc.js - How to mirror brush across multiple charts?
dc.js https://dc-js.github.io/dc.js/ is an extension of d3.js that has some extra UI features like the brush feature where user's can select a range by click dragging on the chart - https://dc-js.github.io/dc.js/examples/scatter-series.html
我正在查看以下示例:https://dc-js.github.io/dc.js/examples/ and the brush
in docs @ http://dc-js.github.io/dc.js/docs/html/dc.coordinateGridMixin.html#brushOn__anchor 并且想知道是否有办法在具有相同域的多个图表之间镜像画笔?
我希望有几个系列图表相互堆叠,当用户 select 使用画笔绘制一个范围时,它会 select 所有 3 个图表上的一个范围(不是缩放在它们上面,例如多焦点图表示例 https://dc-js.github.io/dc.js/examples/multi-focus.html) 只需在每个图表上显示 selection 刷。
( ) = 刷 select离子范围
| | = 图表
刷前select离子:
Chart 1 - | |
Chart 2 - | |
Chart 3 - | |
刷后selection
Chart 1 - | ( ) |
Chart 2 - | ( ) |
Chart 3 - | ( ) |
注意:此解决方案在连接到其他图表或真实数据时会出现问题。
由于需要对所有图表进行通用实施,正确的解决方案已停滞,请参阅:
https://github.com/dc-js/dc.js/issues/681
https://github.com/dc-js/dc.js/issues/682
我要介绍的问题是它依赖于
dc.constants.EVENT_DELAY = 0;
debounce in dc.js 主要是为了防止在后端(例如 crossfilter)响应刷新事件太慢时锁定浏览器。您不希望这些事件备份。
如果您尝试将此解决方案连接到其他图表,可能会发生这种情况。所以请不要接受这个答案,但我确实得到了一些工作。
这里我们禁用延迟以防止画笔同步滞后,"at our peril"。
基本上我们可以绑定filtered
事件来在其他图表上设置过滤器。我们还需要防止连锁反应,因为每个图表都会依次触发 filtered
事件。
const charts = [chart1,chart2,chart3,chart4];
let broadcasting = false; // don't repropogate (infinite loop)
for(const chartA of charts)
chartA.on('filtered', function(chart, filter) {
if(broadcasting)
return;
broadcasting = true;
for(const chartB of charts.filter(chartB => chartB !== chartA))
chartB.replaceFilter(filter);
broadcasting = false;
})
(没有broadcasting
标志,会进入死循环,导致页面崩溃。)
同样,当与其他图表或真实数据连接时,这可能会 运行 出现性能问题。我不确定这是否可以在不更改库的情况下正确完成 - 上述问题描述了需要什么。
dc.js https://dc-js.github.io/dc.js/ is an extension of d3.js that has some extra UI features like the brush feature where user's can select a range by click dragging on the chart - https://dc-js.github.io/dc.js/examples/scatter-series.html
我正在查看以下示例:https://dc-js.github.io/dc.js/examples/ and the brush
in docs @ http://dc-js.github.io/dc.js/docs/html/dc.coordinateGridMixin.html#brushOn__anchor 并且想知道是否有办法在具有相同域的多个图表之间镜像画笔?
我希望有几个系列图表相互堆叠,当用户 select 使用画笔绘制一个范围时,它会 select 所有 3 个图表上的一个范围(不是缩放在它们上面,例如多焦点图表示例 https://dc-js.github.io/dc.js/examples/multi-focus.html) 只需在每个图表上显示 selection 刷。
( ) = 刷 select离子范围 | | = 图表
刷前select离子:
Chart 1 - | |
Chart 2 - | |
Chart 3 - | |
刷后selection
Chart 1 - | ( ) |
Chart 2 - | ( ) |
Chart 3 - | ( ) |
注意:此解决方案在连接到其他图表或真实数据时会出现问题。
由于需要对所有图表进行通用实施,正确的解决方案已停滞,请参阅:
https://github.com/dc-js/dc.js/issues/681
https://github.com/dc-js/dc.js/issues/682
我要介绍的问题是它依赖于
dc.constants.EVENT_DELAY = 0;
debounce in dc.js 主要是为了防止在后端(例如 crossfilter)响应刷新事件太慢时锁定浏览器。您不希望这些事件备份。
如果您尝试将此解决方案连接到其他图表,可能会发生这种情况。所以请不要接受这个答案,但我确实得到了一些工作。
这里我们禁用延迟以防止画笔同步滞后,"at our peril"。
基本上我们可以绑定filtered
事件来在其他图表上设置过滤器。我们还需要防止连锁反应,因为每个图表都会依次触发 filtered
事件。
const charts = [chart1,chart2,chart3,chart4];
let broadcasting = false; // don't repropogate (infinite loop)
for(const chartA of charts)
chartA.on('filtered', function(chart, filter) {
if(broadcasting)
return;
broadcasting = true;
for(const chartB of charts.filter(chartB => chartB !== chartA))
chartB.replaceFilter(filter);
broadcasting = false;
})
(没有broadcasting
标志,会进入死循环,导致页面崩溃。)
同样,当与其他图表或真实数据连接时,这可能会 运行 出现性能问题。我不确定这是否可以在不更改库的情况下正确完成 - 上述问题描述了需要什么。