我已经定义了一个线生成器 d3.js
如下:
var line = d3.svg.line()
.interpolate("monotone")
.x(function(d) {return x(d.date); })
.y(function(d) {return y0(d.visits); });
使用以下格式从csv读取数据:
date,visits
12/08/12,1
13/08/12,0
14/08/12,0
15/08/12,33
16/08/12,28
csv文件已加载到 data
,并解析为:
data.forEach(function(d) {
d.date = d3.time.format("%d/%m/%y").parse(d.date);
d.visits = +d.visits;
});
并添加到文档中:
svg.append("path")
.datum(data)
.attr("class", "line")
.attr("d", line)
在我的脚本的其他地方,我需要弄清楚特定日期的y值。因此,例如,我可能希望获得日期所在行的y值 15/08/12
(相当于 y0(33)
)。我怎样才能做到这一点?
您可以使用 bisect
在数组中找到日期,然后调用 y0
功能。代码看起来像这样(从文档中直接看):
var bisect = d3.bisector(function(d) { return d.date; }).right;
...
var item = data[bisect(data, new Date(2012, 8, 15))];
y0(item.visits);
请注意,此方法要求对日期进行排序,它们位于示例数据中。
您可以使用 bisect
在数组中找到日期,然后调用 y0
功能。代码看起来像这样(从文档中直接看):
var bisect = d3.bisector(function(d) { return d.date; }).right;
...
var item = data[bisect(data, new Date(2012, 8, 15))];
y0(item.visits);
请注意,此方法要求对日期进行排序,它们位于示例数据中。
编辑
为了躲避Lars的例子,通过一个小调整来避免-1 hacks:
var bisect = d3.bisector(function(d) { return d.date; }).left;
...
var item = data[bisect(data, new Date(2012, 8, 15))];
y0(item.visits);
原帖
rudivonstaden,你可以在Lars的例子中使用附加到平分线的.left函数而不是.right - 这样你就不必做你做过的-1 hack了。