所以这是一个关于一个特定问题的问题。正如我从dc.js的主要贡献者Gordon所知,对于对数刻度,不支持elasticY(true)函数。
因此,在了解了这一点之后,我尝试通过在dc.js的renderlet事件中构建一个变通方法来实现我自己的解决方案。用户单击条形图时始终会触发此事件。我想做的是:
let groupSize = this.getGroupSize(fakeGroup, this.yValue);
let maximum = group.top(1)[0].value;
let minimum = group.top(groupSize)[groupSize-1].value;
console.log(minimum, maximum);
chart.y(d3.scale.log().domain([minimum, maximum])
.range(this.height, 0)
.nice()
.clamp(true));
我想,在这一点上,“fakeGroup”(只是group.top(50))只包含用户点击某处后未过滤掉的数据点。但是,此组始终包含前50个中的所有数据点,并且不会更改筛选器事件。
我真正想要的是获取未滤除的所有数据点,以获得yScale的新的最大值和最小值,并通过再次调用chart.y(...)来相应地重新缩放yAxis。
有没有办法只获取仍在图表中但未过滤掉的数据行。我也尝试过使用remove_empty_bins(group),但没有任何运气。即使在给予remove_empty_bins这两个函数之后,某处总是缺少all()或top()。
答案 0 :(得分:1)
这就是我解决它的方法:
我创建了一个名为rescale()的函数,如下所示:
rescale(chart, group, fakeGroup) {
let groupSize = this.getGroupSize(fakeGroup, this.yValue);
let minTop = group.top(groupSize)[groupSize-1].value;
let minimum = minTop > 0 ? minTop : 0.0001;
let maximum = group.top(1)[0].value;
chart.y(d3.scale.log().domain([minimum, maximum])
.range(this.height, 0)
.nice()
.clamp(true));}
我认为参数非常明显,我只是得到我的图表,整个组由dimension.group.reduceSum设置,我创建的假组包含前50个元素,以减少我的条形数量图表。
在事件侦听器
中调用rescale()方法chart.on('preRedraw', (chart) => {
this.rescale(chart, group, fakeGroup);
}
所以我做的是重新定义(重新设置有关过滤数据的最小值和最大值)每次重绘图表时图表yAxis,每次我的某个图表被过滤时也会发生这种情况。所以现在,在过滤另一个图表之后,比例始终适合图表包含的过滤数据。