意外的刷过滤行为

时间:2014-08-01 15:19:32

标签: javascript d3.js dc.js crossfilter

我最近开始学习D3.js,Crossfilter和Dc.js,并且正在努力解决我无法深入解决的问题。

我有两个折线图,一个代表所有数据的概述,另一个代表通过刷新概览创建的更细粒度,放大的间隔版本。两个线图都呈现为相同的间隔(见下文)。

Initial view

顶部图表设置为以下选项:

.dimension(CRS.dimensions.hourly)
.group(CRS.groups.hourly)

和底部:

.dimension(CRS.dimensions.daily)
.group(CRS.groups.daily)

相关的初始化

dimensions.hourly = crs.dimension(function(d){ return d.dd })
dimensions.daily = crs.dimension(function(d){ return d3.time.day(d.dd) })

groups.hourly: dimensions.hourly.group().reduce(
        function(p,v) {
            p.imps += v.imps
            p.clicks += v.clicks
            p.conversions += v.conversions
            p.cost += v.cost

            return p
        },
        function(p,v) {
            p.imps -= v.imps
            p.clicks -= v.clicks
            p.conversions -= v.conversions
            p.cost -= v.cost

            return p
        },
        function() {
            return {
                imps:0,
                clicks:0,
                conversions:0,
                cost:0
            }
        }
    ),
    groups.daily: dimensions.daily.group().order(function(d){return d}).reduce(
        function(p,v) {
            p.imps += v.imps
            p.clicks += v.clicks
            p.conversions += v.conversions
            p.cost += v.cost

            return p
        },
        function(p,v) {
            p.imps -= v.imps
            p.clicks -= v.clicks
            p.conversions -= v.conversions
            p.cost -= v.cost

            return p
        },
        function() {
            return {
                imps:0,
                clicks:0,
                conversions:0,
                cost:0
            }
        }
    )

理想情况下,底部图表在刷过时不会改变,但事实并非如此。当我刷下底图时,它会自动更新,使所有值在所选间隔之外设置为0,这是不希望的:

Brushed view

单击区间外部将重置顶部图形(应该如此),但底部图形不会更改:

Post-brushed view

我尝试了几种解决方案,使底部图形不可变,包括将groups.daily更改为reduceSum,但无济于事。我认为问题在于我如何处理尺寸,但到目前为止我无法获得所需的结果。

如果有人能指出我正确的方向,那就太棒了!谢谢!

1 个答案:

答案 0 :(得分:0)

我最终诉诸.on("preRedraw")听众如下:

.on("preRedraw", function(){
    CRS.dimension.hourly.filterAll();
})

我不确定这是否是最佳解决方案,但似乎可以解决这个问题!