过滤许多饼图的列表并将其删除

时间:2018-07-20 13:27:32

标签: dc.js

我有2个饼图,其数据如下:

data: [
    {diseaseType: 'Cancer', diseaseDetails: 'Lung cancer', quantity: 100},
    {diseaseType: 'Diebetes', diseaseDetails: 'Unspecific', quantity: 650},
    {diseaseType: 'Cancer', diseaseDetails: 'Breast cancer', quantity: 80}
  ]

我想获取过滤器列表,并能够按用户要求将其删除(这是唯一的受控测试代码):

this.diseasePieChart.filters().splice(0, 1)
dc.renderAll()

它正在更新第一个图表,但是第二个(与第一个图表连接)没有更新,就像删除过滤器之前一样。

我正在渲染第二张图表:

self.diseasePieChart.on('filtered.monitor', function (chart) {
// create dimensions etc and render second chart
}

我还尝试在删除过滤器后再次执行crossfilter(data)。当我打电话给dc.filterAll时,所有过滤器都会重置。

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

更改过滤器的正确入口点是chart.filter()chart.replaceFilter(),具体取决于您是尝试切换单个项还是一次更改整个过滤器阵列。

如您所见,操纵图表内的过滤器数组可能会影响图表的绘制方式,但不会将更改传达给交叉过滤器维度和其他图表。

请注意,如上面的链接所述,这些函数中每个函数的参数可接受的类型都有些令人惊讶:

  

filter参数可以采用以下形式之一:

     
      
  • 单个值:将切换该值(如果当前过滤器中不存在该值,则将其添加;如果存在,将其移除)
  •   
  • 一个包含单个值数组([[value,value,value]])的数组:每个值都被切换
  •   
  • 在适合图表时,使用直流滤波器对象,例如      
        dc.coordinateGridMixin图表的
    • dc.filters.RangedFilter
    •   
    • dc.filters.TwoDimensionalFilter用于热图
    •   
    • dc.filters.RangedTwoDimensionalFilter用于散点图
    •   
  •   
  • null:将使用resetFilterHandler重置过滤器
  •   

因此,如果要获取数组,请删除一个项目,然后再将其重新设置,您可以:

var filters = chart.filters().slice(0); // copy the array of filters
filters.splice(0,1)
chart.replaceFilter([filters])
   .redrawGroup();

或(使用切换功能):

chart.filter(chart.filters()[0])
    .redrawGroup();

请注意,您通常希望在更改滤镜后重绘而不是渲染。这样可以显示动画的过渡效果,并且速度更快。

此外,chart.redrawGroupdc.redrawAll()相同,但是如果以后有更多图表组,它会更安全一些。