【发布时间】:2015-07-24 07:35:37
【问题描述】:
我是 dc.js 的新手,所以我可能错过了一些东西,我有时间序列数据,我试图在 3 个时间维度上显示:按月、按天和按小时 - 基本上是显示机器(制造)跨时间的效率。
所以我制作了月份和小时的条形图,以及日期的折线图。代码如下:
var cfdata = crossfilter(dataArray);
var avgadd = function(p,v) {
p.count++;
p.sum += v.efficiency;
p.avg = p.sum/p.count;
return p;
},
avgremove = function(p,v) {
p.count--;
p.sum -= v.efficiency;
p.avg = p.sum/p.count;
return p;
},
avginit = function(){
return {
count: 0,
sum: 0,
avg: 0
}
};
var parseDate = d3.time.format('%a %b %d %Y %H:%M:%S GMT%Z (UTC)').parse;
dataArray.forEach(function(d) {
d.date = parseDate(d.date);
d.hour = d3.time.hour(d.date).getHours();
d.day = d3.time.day(d.date);
d.month = d3.time.month(d.date);
// d.year = d3.time.year(d.date).getFullYear();
});
// dimensions: efficiency by hour
var hourDim = cfdata.dimension(function(d){return d.hour});
var hourlyEff = hourDim.group().reduce(avgadd, avgremove, avginit);
// dimensions: efficiency by day
var dayDim = cfdata.dimension(function(d){return d.day});
var minDay = dayDim.bottom(1)[0].date;
var maxDay = dayDim.top(1)[0].date;
var dailyEff = dayDim.group().reduce(avgadd, avgremove, avginit);
// dimensions: efficieny by month and year
var monthDim = cfdata.dimension(function(d){return d.month});
var minMonth = monthDim.bottom(1)[0].date;
var maxMonth = monthDim.top(1)[0].date;
var monthlyEff = monthDim.group().reduce(avgadd, avgremove, avginit);
dc.barChart(".month-eff-chart")
.height(180)
.width(900)
.dimension(monthDim)
.group(monthlyEff)
.valueAccessor(function(p){return p.value.avg})
.centerBar(true)
.x(d3.time.scale().domain([minMonth, maxMonth]))
.xUnits(d3.time.months)
.xAxis().ticks(d3.time.month, 1).tickFormat(d3.time.format("%b %y"));
dc.lineChart(".day-eff-chart")
.height(180)
.width(900)
.dimension(dayDim)
.group(dailyEff)
.valueAccessor(function(p){return p.value.avg})
.elasticX(true)
.x(d3.time.scale())
.xUnits(d3.time.days)
.xAxis().ticks(d3.time.week, 1).tickFormat(d3.time.format("%W/%y"));
dc.barChart(".hour-eff-chart")
.height(180)
.width(900)
.dimension(hourDim)
.group(hourlyEff)
.valueAccessor(function(p){return p.value.avg})
.x(d3.scale.linear().domain([0,23]));
dc.renderAll();
因此,当我打开页面并过滤任何条形图时,另一个条形图将过滤得很好,但折线图将变为空 - 线条将完全消失。当我将折线图更改为条形图时,它可以工作 - 过滤器就好了。
我一定是错过了什么。
此外,也欢迎提出如何以更有意义的方式显示时间序列数据的建议。谢谢!
编辑:JsFiddle:http://jsfiddle.net/shuzf2vm/2/
【问题讨论】:
-
听起来您的维度之一不是自然有序的。检查以确保您的维度访问器始终为数组中的每个数据元素返回相同类型的值。
-
这不会使它在条形图格式中也失败吗?我之前尝试过测试,但似乎不是问题所在。将再次测试。
-
条形图和折线图共享它们的大部分代码,所以如果它们的行为不同,我真的很惊讶。如果您发布小提琴,我相信我可以很快找到它。 Putting data in a jsFiddle.
-
@asyraf9 可能不是因为分组和过滤器不同。但正如 Gordon 所说,解决这个问题的方法是组合一个工作演示。那么应该很容易找出问题所在。
-
jsFiddle 来了。几分钟后更新
标签: javascript d3.js dc.js crossfilter