代码之家  ›  专栏  ›  技术社区  ›  Dolomite

dc。js和交叉过滤器自定义值访问器

  •  0
  • Dolomite  · 技术社区  · 8 年前

    我正在尝试按小时绘制平均计数图表,自定义reduce函数几乎可以在这里工作 https://jsfiddle.net/dolomite/6eeahs6z/

    日期、小时、计数

    2017年7月2日,22日,5日

    2017年7月9日,22日,3日

    简而言之,我试图找出如何得到每小时的总计数,然后除以数据中的天数,无论选定的一天是否有每小时的记录。

    当前工时维度和自定义缩减为:

    hourDim = ndx.dimension(function (d) {
        return d.EventHour;
    })
    
    hourAvgGroup = hourDim.group().reduce(
                function (p, v) { // add
                    var day = d3.time.day(v.EventDate).getTime();
                    p.map.set(day, p.map.has(day) ? p.map.get(day) + 1 : 1);
                    //p.avg = average_map(p.map);
                    return p;
                },
                function (p, v) { // remove
                    var day = d3.time.day(v.EventDate).getTime();
                    p.map.set(day, p.map.has(day) ? p.map.get(day) - 1 : 0);
                    if(p.map.has(day) && p.map.get(day) == 0) p.map.remove(day);
                    //p.avg = average_map(p.map);
                    return p;
                },
                function () { // init
                    return { map: d3.map() };
                }
            )
    

    .valueAccessor(function(d){ return average_map(d.value.map)})
    

    哪里

    function average_map(m) {
    var sum = 0;
    m.forEach(function(k, v) {
        sum += v;
    });
    return m.size() ? sum / m.size() : 0;
    }
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Dolomite    8 年前

    如果有人试图这样做,我创建了一个维度来保存数据中的所有记录:

    allDim = ndx.dimension(function (d) {
            return typeof Modality === 'string';
    })
    

     dayCountGroup = allDim.group().reduce(
         function (p, v) { // add
                    var day = d3.time.day(v.EventDate).getTime();
                    p.map.set(day, p.map.has(day) ? p.map.get(day) + 1 : 1);
                    return p;
                },
                function (p, v) { // remove
                    var day = d3.time.day(v.EventDate).getTime();
                    p.map.set(day, p.map.has(day) ? p.map.get(day) - 1 : 0);
                    if(p.map.has(day) && p.map.get(day) == 0) p.map.remove(day);
                    return p;
                },
                function () { // init
                    return { map: d3.map() };
                }
            )
    

    小时维度和组为:

    hourDim = ndx.dimension(function (d) {
        return d.EventHour;
    })
    
    hourAvgGroup = hourDim.group().reduce(
                function (p, v) { // add
                    var day = d3.time.day(v.EventDate).getTime();
                    p.map.set(day, p.map.has(day) ? p.map.get(day) + 1 : 1);
                    return p;
                },
                function (p, v) { // remove
                    var day = d3.time.day(v.EventDate).getTime();
                    p.map.set(day, p.map.has(day) ? p.map.get(day) - 1 : 0);
                    if(p.map.has(day) && p.map.get(day) == 0) p.map.remove(day);
    
                    return p;
                },
                function () { // init
                    return { map: d3.map() };
                }
            )
    

    .valueAccessor(function(d){ return sum_map(d.value.map)/size_array_of_maps(dayCountGroup.top(Infinity)) ? sum_map(d.value.map)/size_array_of_maps(dayCountGroup.top(Infinity)) : 0})
    

    其中使用的两个功能是:

    function sum_map(m) {
    var sum = 0;
    m.forEach(function(k, v) {
        sum += v;
    });
    return m.size() ? sum : 0;
    }
    
    function size_array_of_maps(myObject) {
        var count = 0;
    
        myObject.forEach(function(key,value) {
                count += key.value.map.size();
        })
       return count;
    }
    

    我肯定这里有很多冗余代码,但小提琴似乎在工作,我稍后会整理:)

    https://jsfiddle.net/dolomite/6eeahs6z/126/