dc.js-过滤后从堆叠的条形图中删除空箱

时间:2018-08-20 11:07:35

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

这是堆积条形图的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;

                  });
              }
          };
      }

1 个答案:

答案 0 :(得分: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并不满意。这就是为什么您不想只删除空堆栈的原因。仅当所有堆栈均为零时才删除垃圾箱。