我正在寻找一种解决方案,了解如何在使用reduce添加/删除功能时删除空箱。
我有一个jsfiddle here
当我想提供简单的“点数”总和时,会删除空箱,但是当我想使用平均计算并在图表中使用valueAccessor时,则不会删除空箱。
我的数据设置如下:
{Season:"2016/17",
Manager:"Alan Curtis",
Points:1,
Formation:"4231",
date:"01 February 2017"},
{Season:"2016/17",
Manager:"Paul Clement",
Points:1,
Formation:"442",
date:"01 February 2018"},
{Season:"2015/16",
Manager:"Paul Clement",
Points:3,
Formation:"433",
date:"01 May 2017"},
我的目标是提供每场比赛的积分'平均,由经理'以及'形成'。
我使用reduce添加/删除功能:
function reduceAdd(p, v) {
p.total += v.Points;
++p.count;
p.ppg = d3.round((p.total / p.count), 2);
return p;
}
function reduceRemove(p, v) {
p.total -= v.Points;
--p.count;
p.ppg = d3.round((p.total / p.count), 2);
return p;
}
function reduceInitial() {
return {
total: 0,
count: 0,
ppg: 0,
};
}
并删除空箱代码:
function remove_empty_bins(source_group) {
return {
all:function () {
return source_group.all().filter(function(d) {
return d.value !=0;
});
}
};
}
我的图表代码:
managerChart
.dimension(dimManager)
.group(ManagerPPGGroup)
.ordering(function(p) { return -p.value.ppg })
.renderLabel(false)
.othersGrouper(null)
.renderTitle(false)
.renderTitleLabel(true)
.margins({top: 10, left: 10, right: 20, bottom: 80})
.valueAccessor(function(p)
{ if (p.value.ppg >0) {
return p.value.ppg } else { return "n/a"}; });
formationChart
.dimension(dimFormation)
.group(filteredFormationPPGGroup)
.ordering(function(p) { return -p.value.ppg })
.renderLabel(false)
.cap(10)
.elasticX(true)
.renderTitle(false)
.renderTitleLabel(true)
.margins({top: 10, left: 10, right: 20, bottom: 80})
.valueAccessor(function(p) { return p.value.count > 0 ? p.value.ppg : "not used"; });
除了应用过滤器时不会移除空箱,一切正常。
我尝试了各种各样的事情来解决问题,更改图表的valueAccessor和remove_empty_bins函数,但似乎没有任何效果。
我目前的解决方法是提供"未使用"图表上的文字,以便用户知道经理没有使用该表格,但我更喜欢按预期删除空箱。
提前感谢您的帮助。
答案 0 :(得分:2)
是的,如果减少产生一个对象而不是一个数字,则需要调整remove_empty_bins
。
我想不出任何一般的方法来做到这一点不会使它效率低下, * 所以让我们调整这个用例的函数:
function remove_empty_bins(source_group) {
return {
all:function () {
return source_group.all().filter(function(d) {
return d.value.total != 0;
});
}
};
}
我们只需将.total
拉出对象,因为an object (almost) never equals zero。
作为奖励,我还将小条设置为固定高度:
formationChart
.fixedBarHeight(30)
否则当有一个酒吧时,它会变得适合整个区域,很多人都认为这个区域很难看。
我还对管理器rowChart应用了过滤。小提琴的叉子:https://jsfiddle.net/gordonwoodhull/qw0oe8ea/6/
* 也许是时候用谓词将其重构为remove_bins()
了?但是,在无箭头功能的浏览器消失之前,这一点不会简洁。