D3.js时间尺度意外行为



我在循环中创建了一系列对象。在每个对象内部,我都有一个键值对存储时间。为了实现这一目标,我使用了D3.js的时间尺度。但是我没有像我预期的那样得到结果。代码是

var xscale = d3.scaleTime()
    .range([new Date(2000, 0, 1), new Date(2000, 0, 2)])
    .domain([0, 288]);
var dataprovider = [];
var ti = 0;
for (var k = 0; k < 288; k++) {
  var t = xscale(ti++);
  dataprovider.push({
    x: t,
    y: Math.random() * 100
  });
}
console.log(dataprovider);

jsfiddle链接

这不是出乎意料的:在D3中,时间尺度必须有时间在域中

时间尺度是具有时间域的线性量表的变体。(强调我的)

因此,要实现想要的目标,您应该交换域和范围...

var xscale = d3.scaleTime()
    .domain([new Date(2000, 0, 1), new Date(2000, 0, 2)])
    .range([0, 288]);

...然后使用倒置:

给定一个范围的值,从域返回相应的值。

这是一个演示:

  var xscale = d3.scaleTime()
    .domain([new Date(2000, 0, 1), new Date(2000, 0, 2)])
    .range([0, 288]);
    
  var dataprovider = [];
  var ti = 0;
  for (var k = 0; k < 288; k++) {
    var t = xscale.invert(ti++);
    dataprovider.push({
      x: t,
      y: Math.random() * 100
    });
  }
  console.log(dataprovider);
<script src="https://d3js.org/d3.v4.min.js"></script>

最新更新