DC.js - 空白数据点和直方图

时间:2017-02-10 07:39:36

标签: javascript dc.js crossfilter

我有一个包含DC行图和直方图(DC条形图)的仪表板。我的数据集有100行和10个字段。六个字段具有全部100个数据点,而其他四个字段具有95个数据点和5个空白。我需要以对用户透明的方式在一个仪表板上显示所有字段。

对于行图,我只是绘制空白图表并使用.label()属性将行名称设置为“未分配”,其中有空白。

对于直方图,我被卡住了。我想显示一个标记为“未分配”的列,以及直方图的正常线性列。从直方图中隐藏空白行也是可以的。

我无法过滤直方图背后的维度,因为这会从交叉过滤变量中删除行,事实,这意味着我无法看到包含它们的六个字段的行。

标准假组不起作用,因为对于直方图,当我们到达组时,我们已经有数字桶,因此没有具有空白键。

留给自己,DC将空白解释为零并相应地对它们进行分析。我尝试限制维度,这可以使零桶减少5:

var dim = facts.dimension(function(d){ if (d[field]!='') { return Math.floor(+d[field]/binwidth)*binwidth; } });

但是这样做,5行的计数只是在其他桶中随机分配(似乎)。当我在行图上点击“未分配”时,直方图在随机存储桶中显示5个,有时是两个存储桶,而我认为它们应该什么都不显示。

我可以计算空行(它并不总是5行),并想知道我是否可以通过虚假组从零容器中减去它。但我无法弄清楚如何添加键值对或调整key = 0的现有值;

    var grp = dim.group().reduceCount();
    var grp2 = {all: function() { return grp.top(Infinity); }};

我无法通过print_filter或console.log看到足够的结构来确定如何更改它。对不起,问题的长度。任何帮助表示赞赏!

艾玛

1 个答案:

答案 0 :(得分:2)

将它们放入单独的列中会很棘手,因为线性x标度不能很好地适应额外的/ NA /非数值。

我认为您必须切换到序数比例才能将数字和非数字列放在一起。有点乱,但可能。

让我们专注于更简单的想法,只是跳过这些值。我认为你在这里走在正确的轨道上。

问题是您的维度键功能并不总是返回值:

var dim = facts.dimension(function(d){
    if (d[field]!='') {
        return Math.floor(+d[field]/binwidth)*binwidth;
    }
});

else-branch只是通过,JavaScript函数的隐式返回值是undefined。因此,您最终得到了一些数字键,以及一些带有undefined键的行。我不确定crossfilter会对这些行做什么,但自documentation specifies that the key function must returned naturally-ordered values以来,我的猜测就是它会混淆。

相反,也许让这个函数返回一个远远超出直方图域的值?

var dim = facts.dimension(function(d){
    if (d[field]!='') {
        return Math.floor(+d[field]/binwidth)*binwidth;
    }
    else return -1000;
});

然后很容易创建fake group that screens out a particular value

function remove_bins(source_group) { // (source_group, bins...}
    var bins = Array.prototype.slice.call(arguments, 1);
    return {
        all:function () {
            return source_group.all().filter(function(d) {
                return bins.indexOf(d.key) === -1;
            });
        }
    };
}
var grp = remove_bins(dim.group(), -1000);