我正在使用d3.time.scale构建一个简单的条形图:
var data = [
{"date": new Date("1992-05-01 00:00:00"), "value": 10},
{"date": new Date("1997-05-01 00:00:00"), "value": 110},
{"date": new Date("2007-05-11 00:00:00"), "value": 34}
];
var width = 300;
var height = 200;
var barWidth = width / data.length;
var x_domain = d3.extent(data, function(d) { return d.date; });
var x = d3.time.scale()
.domain(x_domain)
.rangeRound([0, width]);
var y = d3.scale.linear()
.domain([0, d3.max(data, function(d) { return d.value; })])
.range([height, 0]);
var chart = d3.select(".chart")
.attr("width", width )
.attr("height", height )
.append("g")
.attr("transform", function(d, i) { return "translate(" + i * barWidth + ",0)"; });
var bar = chart.selectAll("g")
.data(data)
.enter().append("g")
.attr("transform", function(d, i) {
return "translate(" + i * barWidth + ",0)";
});
bar.append("rect")
.attr("class", "bar")
.attr("y", function(d) {
return y(d.value);
})
.attr("height", function(d) {
return height - y(d.value);
})
.attr("width", barWidth - 1);
JSFiddle here。
每个日期值一对吧 - 简单。我想在它们之间生成日期并为它们分配0值。最好的方法是什么?
欢迎任何帮助
答案 0 :(得分:1)
填写缺少的日期很简单,只需直接的javascript。类似的东西:
function addDays(date, days) {
var result = new Date(date);
result.setDate(date.getDate() + days);
return result;
}
function fillInDates(data){
// put current data hash for efficient retrieval
// determine min/max of data
var currentDates = {};
var maxDate = new Date(-1e15);
var minDate = new Date(1e15);
for (var i = 0; i <= data.length; i++){
if (data[i]['date'] > maxDate){
maxDate = data[i]['date'];
}
if (data[i]['date'] < minDate){
minDate = data[i]['date'];
}
currentDates[data[i]['date']]= data[i]['value'];
}
// loop data and fill in missing dates
var filledInDates = [];
while (minDate < maxDate){
filledInDates.push({"date":minDate, "value":currentDates[minDate] ? currentDates[minDate] : 0});
minDate = addDays(minDate, 1);
}
return filledInDates;
}
注意来自here的addDays函数。
让d3
来描绘这个是一个不同的故事。你现在有5488个条形图,为了使数学运算(要使条形宽度> 0),你需要将图形宽度增加到10,000像素。
查看更新的fiddle。