我遇到一个问题,D3.js强制日期转换为整数,因为它将它们传递给轴函数。这在我的Axis上打破d3.time.format
。基本上我有:
axis.tickformat(d3.time.format("%Y-%m-%d"))
然而,这会引发错误,因为当它尝试格式化日期时,它会传递日期的整数值而不是原始日期对象(我的数据集中有Date对象,我已经检查过)。
相反,我必须这样做:
format = d3.time.format("%Y-%m-%d")
axis.tickFormat(function(date) { format(new Date(date)) })
哪个有效,但似乎错了,没必要。我做错了吗?
编辑:一些其他信息:
time.format函数需要Date对象。然而,似乎正在发生的是被强制转换为一个简单的整数Number。 d3.time.format使用Date.getYear()
之类的函数进行格式化,因此在调用整数时会导致未定义的错误。
如前所述,通过新的Date()传递所有内容,但它应该是不必要的,因为原始数据集实际上是所有日期。
工作示例在此处运行:https://wealthbar.github.io/angular-d3/。然而,它有点复杂,也涉及AngularJS。
答案 0 :(得分:0)
d3.time.format
的返回是一个函数,它接受一个字符串(在这种情况下它返回一个Date
对象)或一个Date
对象(在这种情况下它返回一个字符串) 。当您使用d3.time.format
作为axis.tickformat()
的参数时,刻度格式化工具会将基准对象传递给d3.time.format
。您没有指定数据的格式,但很可能是一个数字(自1970年1月1日以来的毫秒数?),在这种情况下它与预期的参数类型d3.time.format
不匹配。
在任何情况下,你所概述的第二种方法都没有错。