我使用的代码类似于dc.js annotated example中的代码:
var ndx = crossfilter(data);
...
var dayName=["0.Sun","1.Mon","2.Tue","3.Wed","4.Thu","5.Fri","6.Sat"];
var dayOfWeek = ndx.dimension(function (d) {
var day = d.dd.getDay();
return dayName[day];
});
var dayOfWeekGroup = dayOfWeek.group();
var dayOfWeekChart = dc.rowChart("#day-of-week-chart");
dayOfWeekChart.width(180)
.height(180)
.group(dayOfWeekGroup)
.label(function(d){return d.key.substr(2);})
.dimension(dayOfWeek);
我遇到的问题是,我的rowChart
中只显示数据中存在的一周中的几天,而且我的所有数据都不能保证每天都有集。
对于许多类别的类别来说,这是理想的行为,但是对于诸如日期和月份名称之类的简短和众所周知的列表省略它们有点令人不安,而我更确切地说包含了一个空行。
对于barChart
,我可以使用.xUnits(dc.units.ordinal)
和.x(d3.scale.ordinal.domain(dayName))
之类的内容。
是否有某种方法可以对rowChart
执行相同操作,以便显示一周中的所有日期,无论是否存在于数据中?
根据我对crossfilter库的理解,我需要在图表级别执行此操作,并且维度是正常的。我一直在dc.js 1.6.0 api reference和d3 scales文档中挖掘,但没有找到我正在寻找的东西。
解决方案
根据@Gordon's answer,我添加了以下功能:
function ordinal_groups(keys, group) {
return {
all: function () {
var values = {};
group.all().forEach(function(d, i) {
values[d.key] = d.value;
});
var g = [];
keys.forEach(function(key) {
g.push({key: key,
value: values[key] || 0});
});
return g;
}
};
}
如下调用此方法将填写任何缺少的0s行:
.group(ordinal_groups(dayNames, dayOfWeekGroup))
答案 0 :(得分:2)
实际上,我认为你最好确保在将它们传递给dc.js之前存在这些组。
执行此操作的一种方法是此处描述的“假组”模式: https://github.com/dc-js/dc.js/wiki/FAQ#filter-the-data-before-its-charted
这样,您可以确保每次数据更改时都会创建额外的条目。
您是说您尝试将额外条目添加到序数域并且它们仍未在行图中表示,而这对条形图有效吗? That sounds like a bug to me.具体来说,看起来需要将对序数域的支持添加到行图中。