【发布时间】:2014-06-22 12:24:57
【问题描述】:
我正在使用类似于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;
}
};
}
如下调用它将用 0 填充任何缺失的行:
.group(ordinal_groups(dayNames, dayOfWeekGroup))
【问题讨论】:
-
谢谢 - 这对我很有帮助。
标签: dc.js crossfilter