【问题标题】:dc.js - Remove empty bins from stacked bar chart upon filteringdc.js - 过滤时从堆积条形图中删除空箱
【发布时间】:2026-01-24 04:20:02
【问题描述】:

这是堆积条形图的fiddle。此图表过滤另一个折线图。

为了移除空垃圾箱,我尝试了dc.js FAQthis examplethis

我看到thisthis 用于堆叠条形图场景,但我的分组不同。 我尝试了不同的方法,但我无法让它发挥作用。

很确定我错过了一些简单的东西。

请检查我的代码。难道我做错了什么?如何让 remove_empty_bins() 工作?

 var stack = dc.barChart('#stack');

 var XDimension = ndx.dimension(function (d) {return d.no;});

          var YDimension_before = XDimension.group().reduce(
            function(p, d) {
              p[d.sub_no] = (p[d.sub_no]|| 0) + +d.avg;
              return p;
            },
            function(p, d) {
              p[d.sub_no] = (p[d.sub_no]|| 0) - +d.avg;
              return p;
            },
            function() {
              return {};});

         var YDimension = remove_empty_bins(YDimension_before);

      stack.width(550)
          .height(400)
          .dimension(XDimension)
          .group(YDimension, '1', sel_stack(1))
          .transitionDuration(500)
          .xUnits(dc.units.ordinal)
          .x(d3.scaleBand())
          .margins({left: 80, top: 20, right: 80, bottom: 80})
          .brushOn(false)
          .clipPadding(20)
          .elasticX(true)
          .elasticY(true)
          .title(function(d) {
          return [ d.key + '[' + this.layer + '] ',
                  d.value[this.layer]].join('\n')
          });
 stack.stack(YDimension, '2', sel_stack(2))
                      .stack(YDimension, '3', sel_stack(3))

function remove_empty_bins(source_group) {
          return {
              all:function () {
                  return source_group.all().filter(function(d) {
                     return d.value != 0;

                  });
              }
          };
      }

【问题讨论】:

    标签: javascript bar-chart dc.js crossfilter stacked-chart


    【解决方案1】:

    我认为问题在于您正在简化为一个对象,因此d.value 永远不会等于零。

    您可以使用 Object.valuesArray.some 检查每个 bin 是否有任何堆栈非零:

    function remove_competely_empty_bins(source_group) {
              return {
                  all:function () {
                      return source_group.all().filter(function(d) {
                         return Object.values(d.value).some(v => v!=0);
    
                      });
                  }
              };
          }
    

    警告:如果不同的堆栈没有相同的 x 值,dc.js 会不高兴。所以这就是为什么你不想只删除空堆栈。仅当所有堆栈都为零时才删除 bin。

    【讨论】:

    • 谢谢戈登。我的浏览器(chrome)不支持 Object.values。所以我不得不使用 Array.prototype.map() 重新创建你的函数。现在它在我的浏览器中工作正常。 (虽然我不确定我的代码效率如何)。这是一个工作小提琴:jsfiddle.net/JaelB/x1vL3ebj/71
    • 糟糕,我是用手机写的,无法测试。我总是对哪些实用程序是成员函数以及哪些在类上感到困惑。我已经更正了上面的代码。很高兴您找到了一种不同的方式并且总体思路奏效了!
    • 最后一个小提琴的链接已损坏。
    • 与戈登的回答一起工作 - jsfiddle.net/JaelB/mgcrx7ty