问题 如何使用d3.js计算给定x的y值


我已经定义了一个线生成器 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))。我怎样才能做到这一点?


7530
2018-04-26 14:17


起源



答案:


您可以使用 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);

请注意,此方法要求对日期进行排序,它们位于示例数据中。


8
2018-04-26 15:09



谢谢,这是有效的,虽然实际上我不得不使用 item = data[bisect(data), new Date (2012, 8, 15))-1];。由于匹配是精确的,我需要元素左侧的元素,因此-1。有点黑客,但它的确有效。在我的情况下,有所有日期的数据 - 如果不是这种情况,那么这种方法可能不起作用。 - rudivonstaden


答案:


您可以使用 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);

请注意,此方法要求对日期进行排序,它们位于示例数据中。


8
2018-04-26 15:09



谢谢,这是有效的,虽然实际上我不得不使用 item = data[bisect(data), new Date (2012, 8, 15))-1];。由于匹配是精确的,我需要元素左侧的元素,因此-1。有点黑客,但它的确有效。在我的情况下,有所有日期的数据 - 如果不是这种情况,那么这种方法可能不起作用。 - rudivonstaden


编辑

为了躲避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了。


3
2017-07-30 19:39