如何在dc.js / reductio / crossfilter中生成滚动的标准折线图

查波

我想显示一条线图,其中std在日期间隔的值总和上滚动。

生成交叉过滤器/还原对象的代码为:

myCrossfilter = crossfilter(data);

function getRunningDates(numDays) {
    return function getDates(d) {
        var s = d.ValueDate;
        var e = new Date(s);
        e.setDate(e.getDate() + numDays);
        a = [];
        while (s < e) {
            a.push(s);
            s = new Date(s.setDate(
                s.getDate() + 1
            ))
        }
        return a;
    }
}

var dim1 = myCrossfilter.dimension(getRunningDates(20), true);
var dim2 = myCrossfilter.dimension(dc.pluck("ValueDate"));
var group1 = dim1.group();
var group2 = dim2.group();
var reducerRolling = reductio()
    .std("value");
reducerRolling(group1);
var reducer = reductio()
    .sum("value")
reducer(group2);

我已将所有内容放入jsFiddle中以显示我的意思(不相关的问题:我不了解图形上的日期如何超出我dateToInit在提琴中定义的变量)。

我希望底部图表是std顶部图表中值的滚动最终发生的是,std底部图中计算没有sum首先进行汇总(我理解这一点很有意义)。

有没有办法使用一个组作为另一个组的维?如果不是,一个人将如何实现我的目标?

查波

好的,所以我提出了一个基于戈登建议的“假组”方法的解决方案。

我已经用工作版本更新了jsFiddle

其要点是定义自定义归约函数:

reduceAddRunning = function(p,v) {
    if (!p.datesData.hasOwnProperty(v.ValueDate)) {
        p.datesData[v.ValueDate]=0;
    }
    p.datesData[v.ValueDate]+=+v.value;
    p.value+=+v.value;
    return(p);
};
reduceRemoveRunning = function(p,v) {
    p.datesData[v.ValueDate]-=+v.value;
    p.value-=+v.value;
    return(p);
};
reduceInitRunning = function(p,v) {
    return({
        value:0,
        datesData:{},
    });
};

然后像这样建立一个假组:

var running_group = function (source_group,theRunningFn) {
    return {
        all:function () {
            return source_group.all().map(function(d) {
                var arr = [];
                for (var date in d.value.datesData) {
                    if (d.value.datesData.hasOwnProperty(date)) {
                        arr.push(d.value.datesData[date]);
                    }
                }
                return {key:d.key, value:theRunningFn(arr)};
            });
        }
    };
}

theRunningFnmath.std在我的情况。

我仍然有2个问题,它们将成为我猜一个新问题的基础:

  • 这很慢。很高兴听到建议加快速度。(我的图形更新以前很快,现在变慢了。仍然可用,但是变慢了)
  • 我不知道如何处理极端情况。时间序列开头显示的值没有意义,因为它们基于较少的历史记录。当我按日期筛选数据时,也会出现同样的问题。

编辑:以下是基于戈登评论(再次!)的更好的解决方案。

只需进行一个常规求和组并应用以下伪组函数即可:

var running_group_2 = function (source_group,numDays,theRunningFn) {
return {
    all:function () {
        var source_arr = source_group.all();
        var keys = source_arr.map(function(d) {return d.key;});
        var values = source_arr.map(function(d) {return d.value;});
        var output_arr = [];

        for (var i = numDays;i<source_arr.length;i++) {
            if (i<numDays) {
                output_arr.push({key:keys[i],value:0});
            } else {
                output_arr.push({
                    key:keys[i],
                    value:theRunningFn(values.slice(i-numDays,i))
                });
            }
        }
        return output_arr;
    }
};
}

它解决了速度问题(因为它不那么麻烦,并且不存储要使用的所有每日值,而是使用已经聚合的值)和边缘情况(即使在我的情况下不易推广)有关极端情况:当我没有足够的点来计算运行变量时,我认为没有显示任何值)。

这是第二个(出于我的目的更好)解决方案jsFiddle

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

DC JS:如何在单击时突出显示汇总数据表中的行,类似于折线图?

如何创建带有锁定y轴的水平滚动Chart.js折线图?

dc.js中的双Y轴折线图

dc.js折线图未显示任何内容

dc.js时间序列折线图

如何使用 D3.js 解析新的 Date.now() 对象以生成折线图

如何自动滚动MPAndroidChart折线图?

如何设置折线图的chart.js网格颜色

Chart.js如何在折线图中显示标签和图例的光标指针

如何在c3js中设置样式折线图点的样式

如何在js折线图中获取两个输出JSON对象?

如何在折线图js中显示多个数据集

如何在chart.js的折线图底部删除多余的空格?

如何在chart.js折线图中添加点?

如何在c3.js折线图或明细图中添加区域标签?

在dc.js中的折线图的x轴上使用年字段

DC JS:删除具有x轴刻度的折线图的外部填充吗?

鼠标缩放不适用于dc.js折线图

过滤其他图表后,dc-js折线图消失了

dc.js堆叠的折线图,具有1个以上的维度

.renderTitle(false) 不适用于折线图 DC.js

如何摆脱折线图上每个点顶部的折线(Chart.js)

如何更改由phpexcel生成的折线图的样式?

如何在一个JSON中获取两个查询以显示在Chart.js折线图上?

[SOLVED] ApexCharts.js:如何在折线图中为轴标签设置固定值

如何在chart.js中的条形图和折线图顶部显示数据值3

如何提高dc-tableview.js(DC.js,Crossfilter,数据表,ajax)的性能?

dc.js带有条形图和折线图的复合图表。在栏上实现单选

如何使用 Echarts (JS) 为折线图的每个点显示工具提示