我正在使用一些D3代码来整理我的DC箱图,例如使circle.outlier半径变小,在每个boxplot后插入一个矩形并附加悬停的标题。
这适用于页面加载。我希望它也能用于过滤。它适用于一种过滤而不是另一种过滤。
我在同一个仪表板上有一个直方图,并且使用.brushOn(true),我有一个事件,可以正确更新过滤器上的箱图:
.on("filtered", function(obj){ update(); });
此代码调用下面的函数,该函数调用另外两个函数:(1)updateFactorFields2,它通过假组更新箱图后面的数据,似乎可以工作。 (2)tidyBoxPlots,这就是问题所在。
function update() {
var grps = window.grps;//an array holding my crossfilter groups
var dims = window.dims; //an array holding CF dimensions
updateFactorFields2(grps[0]);
factorBox.render();//factorBox is my DC boxplot chart
tidyBoxPlots('postRender');
}
tidyBoxPlots也会更新.title,但下面的代码就足够了。 tidyBoxPlots最终由histChart.on(“filtered”,...)触发时有效。
function tidyBoxPlots(evType) {
d3.selectAll("circle.outlier").attr("r","2");//works in one case and not another
d3.selectAll("g.box").insert("rect","line.center").attr("x","0").attr("y","0").attr("width","8").attr("height","102.5").attr("class","boxHover");//ditto
}
但是,即使调用update()并且updateFactorFields工作,tidyBoxPlots在由下面的触发时也不起作用:
$("[id='filterDropdown']").on('change',function(e,p){
if (p.selected) {
var tempIndex = filters[0].indexOf(e.target.id);
filters[6][tempIndex].push(p.selected);//store this filter
filters[5][tempIndex].filterFunction(function(d){ return filters[6][tempIndex].indexOf(d)!=-1; });//filter the dimension stored in filters[5] by the array values stored in filters[6]
update();//calls update() fine
}
我很确定问题是我正在使用的事件类型,因为我之前遇到过这个问题。所以我尝试了大多数,如果不是所有这些,但没有快乐:
http://dc-js.github.io/dc.js/docs/html/dc.baseMixin.html#on
我正在使用selected.js作为我的下拉列表,因此是jquery。
有人可以帮忙吗?
由于
答案 0 :(得分:1)
对于遇到同样问题的其他人:问题是获得正确的事件类型以及相对于dc.renderAll()的正确位置调用update();