防止图表重新计算自己的百分比

时间:2016-08-04 02:14:59

标签: d3.js dc.js crossfilter reductio

我有三个行图表,只要用户第一次登陆页面或点击图表的矩形条,我的代码就会计算并更新每个图表的百分比。这是计算百分比的方式

    的 posChart
    %Position =每个位置的唯一StoreNumber计数/所有POSITION的唯一StoreNumber计数

    的 deptChart
    %部门=所有部门的每个部门/职位计数的职位数量

    的状态图
    %States =每个STATE的唯一StoreNumber计数/所有STATE的唯一StoreNumber计数

我想要的是当用户点击rowChart的矩形栏,例如“按状态计算”时,它应该更新/重新计算该图表的百分比(它不应该影响它自己的百分比),但是,应该重新计算其他两个图表的百分比,即“按部门计算”和“按位置计算”。同样的场景也适用于其他图表。这就是我要的

如果用户点击了

  1. “按部门计算”图表 - >重新计算“按位置计算”和“按州计算”图表的百分比

  2. “按位置计算”图表 - >重新计算“按分销商计算”和“按州分类”图表的百分比
  3. 请帮助!!
    link: http://jsfiddle.net/mfi_login/z860sz69/

    感谢您的回复。 您提供的解决方案存在问题。我正在寻找所有过滤器的全局总计,但我不希望在用户点击当前图表的矩形栏时更改这些总计。
    例如 如果有两个不同的POSITIONS(主管,客户经理)具有相同的StoreNumber(3),那么我希望StoreNumber被计为1而不是2

    如果我们举一个客户经理%计算的例子(按位置计算图表)

    total unique StoreNumbers=3
    Total Account Manager POSITIONs=2
    % = 2/3=66%
    

    有没有办法在不触及当前图表的情况下重绘其他两个图表?

1 个答案:

答案 0 :(得分:0)

在我看来,你真正想要的是使用图表组的总数,而不是整体总数。如果使用总计,则会观察所有过滤器,但如果使用当前组的总数,则不会在当前图表上观察到任何过滤器。

这将产生您想要的效果 - 它不是要阻止任何计算,而是确保每个图表仅受其他图表上的过滤器的影响。

因此,让我们定义bin_countersum_group,而不是sum_group_xep

function sum_group(group, acc) {
    acc = acc || function(kv) { return kv.value; };
  return d3.sum(group.all().filter(function(kv) {
    return acc(kv) > 0;
  }), acc); 
}

function sum_group_xep(group) {
    return sum_group(group, function(kv) {
    return kv.value.exceptionCount;
  });
}

我们会在每张图表中使用这些,例如:

    posChart
        .valueAccessor(function (d) { 
            //gets the total unique store numbers for selected filters                
            var value=sum_group_xep(posGrp)
            var percent=value>0?(d.value.exceptionCount/value)*100:0                
            //this returns the x-axis percentages
            return percent               
        })

    deptChart
        .valueAccessor(function (d) { 
                total=sum_group(deptGrp)
                var percent=d.value?(d.value/total)*100:0
                return percent
        })  

    stateChart 
        .valueAccessor(function (d) {
            var value=sum_group_xep(stateGrp);
            return value>0?(d.value.exceptionCount/value)*100:0
        })  

......以及其他6个地方。如果没有那么多重复的代码,可能有更好的方法来组织它,但我并没有真正考虑过它!

你小提琴的叉子:http://jsfiddle.net/gordonwoodhull/yggohcpv/8/

编辑:Reductio可能有更好的快捷方式,但我认为除以当前图表组中的总值而不是使用观察所有过滤器的groupAll的原则是正确的开始