Javascript dc和交叉过滤器-计算记录中的百分比

Javascript dc和交叉过滤器-计算记录中的百分比,javascript,bar-chart,dc.js,crossfilter,Javascript,Bar Chart,Dc.js,Crossfilter,我正试图在我的一个dc图表中计算并绘制百分比(%) 我已经阅读了API和关于reduce函数的多个示例(add、remove和init等) 我参考了&以获取我的代码 我想计算衰减百分比(总和(衰减\数据)/总和(所有\数据);衰减\数据在数据中由“衰减\指数==1”定义) 由于一些问题,我仍然没有在图中得到任何东西,也使用了值访问器,但是,这可能有一些问题 在代码中,请仅查看“percentgroup”和“datedimension”,其他用于单独的图表 到目前为止,我的代码是: var ch

我正试图在我的一个dc图表中计算并绘制百分比(%)

我已经阅读了API和关于reduce函数的多个示例(add、remove和init等) 我参考了&以获取我的代码

我想计算衰减百分比(总和(衰减\数据)/总和(所有\数据);衰减\数据在数据中由“衰减\指数==1”定义)

由于一些问题,我仍然没有在图中得到任何东西,也使用了值访问器,但是,这可能有一些问题

在代码中,请仅查看“percentgroup”和“datedimension”,其他用于单独的图表

到目前为止,我的代码是:

 var chart = dc.pieChart("#test");
var chart2 = dc.barChart("#test2");
var chart3 = dc.barChart("#test3");

  console.log(data[0]);
  //Filtering only target population
  data = data.filter(function (d) { return d.target_ind == "1"; });

  var ndx  = crossfilter(data);


  bucketDimension  = ndx.dimension(function(d) {return "Bucket : " +d.decay_bucket;});
  speedSumGroup = bucketDimension.group().reduceSum( function(d) { return d.Count ;});

  dateDimension  = ndx.dimension(function(d) {return d.duration ;});
  rechGroup = dateDimension.group().reduceSum ( function(d) { return d.recharge_revenue ;});

    var percentGroup = dateDimension.group().reduce(
        //add
        function(p, v) {
            ++p.count;
            p.decay += (v.decay_ind === '1' ? p.recharge_revenue : 0);
            p.total += p.recharge_revenue;
            p.percent = p.count ? p.decay/p.total : 0;
            return p;
        },
        function(p, v) {
            --p.count;
            p.decay -= (v.decay_ind === '1' ? p.recharge_revenue : 0);
            p.total -= p.recharge_revenue;
            p.percent = p.count ? p.decay/p.total : 0;
            return p;
        },
        function() {
            return {
                count: 0,
                decay : 0,
                total : 0,
                percent : 0

            };
        }
        );


        chart3
        .width(768)
        .height(480)
        .x(d3.scale.ordinal())
        .xUnits(dc.units.ordinal)
        //.brushOn(false)
        .yAxisLabel("Decay %")
        .dimension(dateDimension)
        //.group(decayGroup)

        .on('renderlet', function(chart) {
            chart.selectAll('rect').on("click", function(d) {
                console.log("click!", d);
            });
        });


      chart3.valueAccessor(function (p) {
        return p.value.percent;
        })
        .group(percentGroup);
我错过了什么? 任何方法/建议都会非常有用

更新

好的,我已经纠正了一些错误,现在,我只是想得到一些总和,以便更好地理解这些函数,并在控制台中看到它们。还添加了duration维度中的所有值

我在控制台中总结了一个名为“充值收入”的变量-add函数会给我随机/垃圾值。移除函数给了我无穷大

我的新代码:

var percentGroup = dateDimension.group().reduce(
    //add
    function(p, v) {
        ++p.count;
        p.total += v.recharge_revenue;
        //p.percent = p.count ? p.decay/p.total : 0;
        console.log(p.total);
        return p;
    },
    //remove
    function(p, v) {
        --p.count;
        p.total -= v.recharge_revenue;
        return p;
    },
    //init
    function() {
        return {
            count: 0,
            total : 0,

        };
    }
    );

chart3
    .width(768)
    .height(480)
    .x(d3.scale.ordinal())
    .xUnits(dc.units.ordinal)
    //.brushOn(false)
    .yAxisLabel("Decay %")
    .dimension(dateDimension)
    .valueAccessor(function (p) {
    return p.value.total;
     })
    .group(percentGroup)
    .on('renderlet', function(chart) {
        chart.selectAll('rect').on("click", function(d) {
            console.log("click!", d);
        });
    });
由于明显的原因,图表仍然为空(控制台显示)

请帮我解决这个问题,我就是不知道这里出了什么问题。一旦计算完毕,我想开始计算百分比

另一个警告:我的数据集(csv)中有一列“Count”,这是不是碰巧造成了这个问题?(已更改为其他名称,仍不工作)

基本上,唯一有效的是在图中计数,如果我使用任何和,平均值,我得到的是随机值,而不是图

欢迎提出任何建议/反馈

更新2:

function(p, v) {
        ++p.count;
        p.total += parseInt(v.recharge_revenue);
        //p.percent = p.count ? p.decay/p.total : 0;
        console.log(p.total);
        return p;
    },
    //remove
    function(p, v) {
        --p.count;
        p.total -= parseInt(v.recharge_revenue);
        return p;
    }
这是我的建议

数据集有两个存储桶和两个持续时间


它显示了总量和平均值的垃圾/随机值。现在请帮我解决这个问题。

数字是字符串格式的,必须解析为整数才能让函数读取它们,值在连接它们时是垃圾

解决方案代码:

function(p, v) {
        ++p.count;
        p.total += parseInt(v.recharge_revenue);
        //p.percent = p.count ? p.decay/p.total : 0;
        console.log(p.total);
        return p;
    },
    //remove
    function(p, v) {
        --p.count;
        p.total -= parseInt(v.recharge_revenue);
        return p;
    }

你得到了什么价值?在reduce函数中设置断点/日志,或者跟踪图表初始化的位置
percentGroup.all()。你的衰变指示器是字符串吗?如果它是一个数字,它将永远不会='1'。持续时间总是有值吗?否则,您的日期维度将无法正常排序。我还建议您在值访问器中进行实际百分比计算。无需每次调用减速器时都运行该计算。@G:图形为空,没有值。(只能看到x,y轴)@EthanJewett:你说得对,持续时间并不是到处都有值,就像我刚才测试的那样。是的,衰变指示器作为字符串导入,测试了“1”和“1”,两者都不起作用。你能分享一个如何计算内部值访问器的例子吗,正如我尝试的那样,但是没有再次工作。在访问器内部的计算不是问题,它只是一个建议。缺少持续时间值可能是问题所在。您应该测试访问器中是否缺少值。请为您看到的这个问题提供一个工作示例(使用JSFIDLE或类似的工具),我们将为您提供帮助。@EthanJewett:这是小提琴:我添加了代码和数据集类型,它给出了随机/垃圾值,包括总计值和平均值,它在这里绘制饼图,因为它是少量值。你现在能帮我解决这个问题吗?