D3填充日期和值

时间:2014-11-27 11:29:51

标签: javascript d3.js

我正在使用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值。最好的方法是什么?

欢迎任何帮助

1 个答案:

答案 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