我有三个行图表,只要用户第一次登陆页面或点击图表的矩形条,我的代码就会计算并更新每个图表的百分比。这是计算百分比的方式
的 posChart :
%Position =每个位置的唯一StoreNumber计数/所有POSITION的唯一StoreNumber计数
的 deptChart :
%部门=所有部门的每个部门/职位计数的职位数量
的状态图:
%States =每个STATE的唯一StoreNumber计数/所有STATE的唯一StoreNumber计数
我想要的是当用户点击rowChart的矩形栏,例如“按状态计算”时,它应该不更新/重新计算该图表的百分比(它不应该影响它自己的百分比),但是,应该重新计算其他两个图表的百分比,即“按部门计算”和“按位置计算”。同样的场景也适用于其他图表。这就是我要的
如果用户点击了
请帮助!!
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%
有没有办法在不触及当前图表的情况下重绘其他两个图表?
答案 0 :(得分:0)
在我看来,你真正想要的是使用图表组的总数,而不是整体总数。如果使用总计,则会观察所有过滤器,但如果使用当前组的总数,则不会在当前图表上观察到任何过滤器。
这将产生您想要的效果 - 它不是要阻止任何计算,而是确保每个图表仅受其他图表上的过滤器的影响。
因此,让我们定义bin_counter
和sum_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的原则是正确的开始