仅从dc.js图表​​中获取未过滤的数据(维度/组)

时间:2017-01-20 15:47:56

标签: d3.js dc.js crossfilter

所以这是一个关于一个特定问题的问题。正如我从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()。

1 个答案:

答案 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,每次我的某个图表被过滤时也会发生这种情况。所以现在,在过滤另一个图表之后,比例始终适合图表包含的过滤数据。