如果提供的比例仅有1个结果,则D3 ticks()不返回值

时间:2014-01-08 23:39:25

标签: d3.js

我有一个x轴,显示我的数据发生的日期。数据是动态的,有时我只有1天,2天,n天的数据等。

以下是我在x轴上显示日期的代码:

chart.x = d3.time.scale()
    .range([0, chart.w]);

chart.xAxis = d3.svg.axis()
    .scale(chart.x)
    .orient("bottom")
    .ticks(d3.time.day)                                 // --- TODO : this is not showing the current day, for some reason...
    .tickFormat(d3.time.format("%b %-d %p"));   

如果我的数据在2天(例如:星期二,星期三)传播,则仅显示第二天(星期三)的勾号,即。当一天从一个“变化”到另一个。 我想在第一天(星期二)显示勾号。 即使1天内只有数据,我仍然想要显示一个勾号。

谢谢你们,

3 个答案:

答案 0 :(得分:2)

要扩展域以便缩放以刻度标记开始和结束,您使用.nice()方法,如@meetamit建议的那样 - 但“nicing”仅在您调用该方法之后才有效/ em>您设置了域名,这就是您可能没有注意到任何更改的原因。 API并没有真正说清楚,尽管由于该方法改变了域名,我认为以后更改域名会覆盖先前nice()调用的影响是有道理的。

此外,请务必使用time-scale version of the method.nice(d3.time.day)将域名四舍五入到最近的一天,而不是最近的一小时。

这是一个小提琴:
http://fiddle.jshell.net/4rGQq/

关键代码很简单:

xScale.domain(d3.extent(d)) 
      //d3.extent() returns max and min of array, which become the basic domain
      .nice(d3.time.day);  
      //nice() extends the domain to nearest start/end of a day

比较在设置域后注释.nice()来电时会发生什么情况,即使在初始化比例期间进行了另一次.nice()调用也是如此。还要比较如果不指定day-interval作为nice方法的参数会发生什么。

答案 1 :(得分:1)

您能说明chart.x是如何设置的吗?很难说没有看到它,但您可以通过致电chart.x.nice()来修复它(请参阅documentation)。

否则,您似乎需要手动检查其域的范围,并在单日情况下进行调整。

<强>澄清

您的代码会显示您致电range()的方式,而不是您如何致电domain(),这是重要的。

在我看来,如果这样做

var domain = chart.x.domain()
console.log domain[0] == domain[1]

只要数据只有一天,您就会看到true被记录。如果是这样,则意味着您处理的是单个时间点而不是时间范围。在这种情况下,您需要将域调整为更长的范围。

真的很难知道甚至没有看到你正在做什么的图像。

答案 2 :(得分:-1)

.ticks()应该用于设置您想要在轴上的刻度数,而不是应该包含在其中的数据类型。因此,请尝试将其设置为.ticks(3),并设置几个刻度 来自维基:
.ticks(第[count])
返回大约从比例输入域计数代表值。如果未指定count,则默认为10.返回的tick值均匀分布,具有人类可读的值(例如10的幂的倍数),并且保证在输入域的范围内。刻度通常用于显示参考线或刻度线,以及可视化数据。指定的计数只是一个提示;根据输入域,比例可能会返回更多或更少的值。