-->

d3js(+ crossfilter / DC)表现箱线图(d3js (+crossfilter/d

2019-10-19 13:33发布

我试图使用D3,Crossfilter和DC的组合产生交互箱线图,主要利用这个例子: https://github.com/dc-js/dc.js/blob/master/web/examples/box- plot.html

我的数据看起来更像是这样的:

id      date        met1
6368    10/24/2013  0.84
6369    10/24/2013  0.67
6374    10/24/2013  0.96
6375    10/24/2013  0.97

用约50万个数据点,这正常工作的一切除了箱图别的。 该代码工作正常和箱线图都很好,但是当我在其他地方更换过滤器需要永远的箱线图更新:

var met1Dim = data.dimension(function(d) {return "metric 01";});
var met1Values = met1Dim.group().reduce(
            function(p, v) {
                p.push(v.met1);
                return p;
            },
            function(p,v) {
                p.splice(p.indexOf(v.met1), 1);
                return p;
            },
            function() {
                return [];
            }

性能大幅提高(但仍不够完美),当我通过整数作为数据(只是用parseInt函数替换v.met1(v.met1 * 100)),但是这是那种半称职的,我想展示在其适当范围内的数据,而不是强迫一切都变成一个整数。 当我删除的数据集时,最显著放缓,我认为这是片(的indexOf())这是(使用浮点数时)放缓都记录下来。 有什么我可以做,使这个操作更快? 我想也许使用的ID数据的关联数组是一个关键,但我不知道如何关联数组传递到降低()函数。

谢谢。

Answer 1:

使用地图查找替代indexOf有一定帮助,但它仍然是不幸的是,你需要通过这样的跳火圈时,所有你真的想要尽可能我可以告诉的只是做一个基本的分组与met1值显示在顶层起来因为这是dc.js期待。

如果dc.js允许您指定允许您定义如何在一个访问功能,这将是非常好的met1在其处需要它的点从绑定对象拉到值。 D3到处使用这个模式,这是非常方便的(并且也是从这种性能密集型杂耍的节省您的)。

除非这种变化dc.js的,我觉得你对地图查找想法可能是最好的选择。 您可以使用您的减少功能关闭范围储存。 因为你的记录有唯一的ID,你可以只使用一个单一的地图,而无需担心碰撞:

var indexMap = {};
var met1Values = met1Dim.group().reduce(
    function(p, v) {
        indexMap[v.id] = p.length;  // length before push is index of pushed element
        p.push(v.met1);
        return p;
    },
    function(p,v) {
        p.splice(indexMap[v.id], 1);
        return p;
    },
    function() {
        return [];
    }
);


文章来源: d3js (+crossfilter/dc) boxplot performance