我有一个包含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看到足够的结构来确定如何更改它。对不起,问题的长度。任何帮助表示赞赏!
艾玛
答案 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);