这似乎是一个很常见的问题,所以我在这里制定了一个示例实现:http: //jsfiddle.net/nrabinowitz/dhW2F/2/
相关代码:
// get the min/max dates
var extent = d3.extent(data, function(d) { return d.date; }),
// hash the existing days for easy lookup
dateHash = data.reduce(function(agg, d) {
agg[d.date] = true;
return agg;
}, {}),
// note that this leverages some "get all headers but date" processing
// already present in the example
headers = color.domain();
// make even intervals
d3.time.days(extent[0], extent[1])
// drop the existing ones
.filter(function(date) {
return !dateHash[date];
})
// and push them into the array
.forEach(function(date) {
var emptyRow = { date: date };
headers.forEach(function(header) {
emptyRow[header] = null;
});
data.push(emptyRow);
});
// re-sort the data
data.sort(function(a, b) { return d3.ascending(a.date, b.date); });
正如您所看到的,这有点令人费解,但似乎运作良好 - 您使用方便的d3.interval.range
方法创建一个间隔均匀的日期数组,过滤掉数据中已经存在的日期,并使用剩余的日期推送空行。一个缺点是大型数据集的性能可能会很慢 - 这假设整行是空的,而不是不同系列中的不同空日期。
另一种表示形式,有间隙(使用line.defined
)而不是零点,在这里:http: //jsfiddle.net/nrabinowitz/dhW2F/3/