如何在d3.js时间刻度中指定tickValues?

Pix*_*ord 2 javascript d3.js

我使用的是 d3,在我的图表中我有一个 UTC 格式的时间刻度。

xScale  = d3.time.scale.utc().range([0,  chartWidth]);
Run Code Online (Sandbox Code Playgroud)

我需要动态指定刻度并动态更改域以避免刻度标签混乱。

我根据域计算刻度并将刻度设置为最接近的 5 倍数。但是,我注意到一个问题,有时在更改域时刻度位置不一致。见下图:

在此输入图像描述

在一些论坛中,我发现可以通过函数设置刻度值tickValues(d3.range(starting value, end value, interval))请参阅 mbostock 的这篇文章

现在我不确定——我怎样才能在我的时间尺度上做同样的事情?如果我想计算我自己的 xAxis 刻度值(使用 UTC 时间刻度),我该怎么做?

谢谢。

Mar*_*ark 5

您想强制每 N 分钟计时一次吗?或N[时间单位]?

您可以使用:

var startDate = new Date(2016, 0, 1, 2, 0, 0),
    endDate = new Date(2016, 0, 1, 4, 0, 0),
    millisecondsBetweenTicks = 300000; //<-- 5 minutes

var x = d3.time.scale.utc()
    .domain([startDate, endDate])
    .range([0, width]);

var xAxis = d3.svg.axis()
    .scale(x)
    .tickValues(d3.range(startDate, endDate, millisecondsBetweenTicks )
                  .map(function(d){ return new Date(d) }) //<-- remap to dates
    );
Run Code Online (Sandbox Code Playgroud)

完整示例:

var startDate = new Date(2016, 0, 1, 2, 0, 0),
    endDate = new Date(2016, 0, 1, 4, 0, 0),
    millisecondsBetweenTicks = 300000; //<-- 5 minutes

var x = d3.time.scale.utc()
    .domain([startDate, endDate])
    .range([0, width]);

var xAxis = d3.svg.axis()
    .scale(x)
    .tickValues(d3.range(startDate, endDate, millisecondsBetweenTicks )
                  .map(function(d){ return new Date(d) }) //<-- remap to dates
    );
Run Code Online (Sandbox Code Playgroud)