给定n个数据点,如何生成插值函数?

时间:2014-11-12 01:04:57

标签: javascript svg d3.js

我遇到了尝试在系列图上的点之间插值的问题,即我的数据如下所示(请假设随机的x,y坐标)

[[x0,y0],[1,1],[2,2],[2,3],..... [x,y]]

并且从内插器中,我想给它1.5并且内插器函数应该为这种情况返回1.5。在数据是随机的其他情况下,它应该找到最适合给定点集并返回给定x值的y值

这可以使用d3 interpolate ***函数吗?

由于

1 个答案:

答案 0 :(得分:1)

虽然您可以使用d3插值器执行此操作,但使用muli-part linear scale可能会更容易。

通常,线性标度具有双值域和双值范围,所有其他值均根据域和范围的起点和终点之间的直线计算。但是,您可以将域和范围都设置为多个值的数组(只要两个数组的长度相同),并且该比例将充当域的每个部分的一系列直线关系。

换句话说,如果您使用x值的数组作为比例域,并将y值的数组作为范围,那么您可以输入任何x值,比例将返回线性相邻y值之间的插值。对于点之外的值,它将推断初始或最终的线性关系:



var points = [
  [0,10],
  [1,32],
  [2,14],
  [3,15]
  ];

var multiLine = d3.scale.linear()
    .domain(
      points.map(function(p){return p[0];})
    )
    .range (
      points.map(function(p){return p[1];})
    );

document.body.innerHTML =
  "Line at 0.0: " + multiLine(0) + "<br/>" +
  "Line at 1.0: " + multiLine(1) + "<br/>" +
  "Line at 1.5: " + multiLine(1.5) + "<br/>" +
  "Line at 2.3: " + multiLine(2.3) + "<br/>" +
  "Line at 3.0: " + multiLine(3) + "<br/>" +
  "Line at 4.0: " + multiLine(4) ;
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
&#13;
&#13;
&#13;

请注意,您需要确保您的积分按x值排序,以使其按预期工作。