2014-11-12 2 views
0

Я столкнулся с проблемой попытки интерполировать значения между точками на графике серии, то есть мои данные выглядят следующим образом (пожалуйста, примите случайные координаты x, y)Как создать функцию интерполяции с учетом n точек данных?

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

и из интерполятора я хотел бы дать ему 1.5, и функция интерполятора должна вернуть 1,5 для этого дело. В других случаях, когда данные являются случайными, они должны найти наилучшее соответствие для данного набора точек и вернуть значение y для заданного значения x.

Возможно ли это с помощью d3-интерполяции *** функций?

Благодаря

+0

[Этот вопрос] (http://stackoverflow.com/questions/11503151/in-d3-how-to-get-the-interpolated-line-data-from-a-svg-line) делает то, что вы хотите Я думаю. –

ответ

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) ;
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

Обратите внимание, что вам нужно, чтобы убедиться, что ваши очки сортируются по й значению для того, чтобы это работает так, как ожидалось.

+0

Большое спасибо. Именно то, что я искал. – user2789284

Смежные вопросы