17

我有一个用 d3.js 绘制的数据集。x 轴代表时间(以分钟为单位)。我想以某种hh:mm格式显示这个轴,但我找不到在 d3 中干净地执行此操作的方法。

我的轴代码如下所示:

svg.append('g')
   .attr('class', 'x axis')
   .attr('transform', 'translate(0,' + height + ')')
   .call(d3.svg.axis()
     .scale(x)
     .orient('bottom'));

它会在几分钟内生成看起来像[100, 115, 130, 140]等的标签。

我目前的解决方案是text在生成元素后选择它们,并用一个函数覆盖它们:

   svg.selectAll('.x.axis text')
   .text(function(d) { 
       d = d.toFixed();
       var hours = Math.floor(d / 60);
       var minutes = pad((d % 60), 2);
       return hours + ":" + minutes;
   });

这会输出轴刻度[1:40, 1:55, 2:10],例如 等。

但这感觉很笨拙并避免使用d3.format. 有没有更好的方法来制作这些标签?

4

1 回答 1

53

如果你有绝对时间,你可能想将你的x数据转换为 JavaScript Date 对象而不是简单的数字,然后你想使用d3.time.scaled3.time.format。轴的“hh:mm”格式示例如下:

d3.svg.axis()
    .scale(x)
    .orient("bottom")
    .tickFormat(d3.time.format("%H:%M"));

实际上,您可能根本不需要指定刻度格式;根据您的刻度域和刻度数,默认时间刻度格式可能足以满足您的需要。或者,如果您想要完全控制,您还可以指定刻度的刻度间隔。例如,对于每十五分钟的滴答声,您可能会说:

d3.svg.axis()
    .scale(x)
    .orient("bottom")
    .ticks(d3.time.minutes, 15)
    .tickFormat(d3.time.format("%H:%M"));

如果您有相对时间持续时间,(因此有代表分钟而不是绝对日期的数字),您可以通过选择任意纪元并即时转换将它们格式化为日期。这样您就可以将数据本身保留为数字。例如:

var formatTime = d3.time.format("%H:%M"),
    formatMinutes = function(d) { return formatTime(new Date(2012, 0, 1, 0, d)); };

由于只会显示分钟和小时,因此您选择的时代无关紧要。下面是一个使用这种技术来格式化持续时间分布的示例:

于 2012-07-02T01:57:25.757 回答