d3.js - запрос относительно интерполированных значений
Я работаю над визуализацией http://bost.ocks.org/mike/nations/:
У меня есть запрос относительно функции интерполяции. Изначально вызывается перемещение мыши, которое вызывает displayYear, где вызываются данные внутриполитического режима.
function mousemove() {
displayYear(yearScale.invert(d3.mouse(this)[0]));
}
}
// Tweens the entire chart by first tweening the year, and then the data.
// For the interpolated data, the dots and label are redrawn.
function tweenYear() {
var year = d3.interpolateNumber(thisyear, 2009);
return function(t) { displayYear(year(t)); };
}
// Updates the display to show the specified year.
function displayYear(year) {
//alert(year);
thisyear=year;
dot.data(interpolateData(year), key).call(position).sort(order);
label.text(Math.round(year));
}
// Interpolates the dataset for the given (fractional) year.
function interpolateData(year) {
return nations.map(function(d) {
return {
name: d.name,
region: d.region,
checkins: interpolateValues(d.checkins, year),
teamsize: interpolateValues(d.teamsize, year),
Checkintimes: interpolateValues(d.Checkintimes, year)
};
// Finds (and possibly interpolates) the value for the specified year.
function interpolateValues(values, year) {
var i = bisect.left(values, year, 0, values.length - 1),
a = values[i];
if (i > 0) {
var b = values[i - 1],
t = (year - a[0]) / (b[0] - a[0]);
return a[1] * (1 - t) + b[1] * t;
}
return a[1];
}
что делает эта функция? Я попытался отладки и обнаружил, что он сравнивает 2 года и делает расчет, а затем возвращает значения. кто-нибудь может уточнить это?
Файл JSON содержит
[
{
"name":"India",
"region":"South Asia",
"income":[[2000,225],[2001,225],[2002,226],[2003,227],[2004,229],[2005,230],[2006,231],[2007,244],[2008,254],[2009,253]],
"population":[[2000,41542812],[2001,41623424],[2002,41866106],[2003,42186202],[2004,41521432],[2005,41827315],[2006,42127071],[2007,42420476],[2008,42707546],[2009,42707546]],
"lifeExpectancy":[[2000,43.56],[2001,43.86],[2002,44.22],[2003,64.61],[2004,56.05],[2005,56.52],[2006,66.02],[2007,68.54],[2008,67.06],[2009,73.58]]
}
]
1 ответ
Для чего предназначен этот код, это случай, когда данные за год (или больше) отсутствуют, что, похоже, не относится к примеру данных, которые вы опубликовали. Во-первых, он находит ближайшую точку данных к данному году, используя bisect.left
и затем вычисляет экстраполяцию между предыдущей точкой данных и текущей точкой данных для запрошенного года.
Обратите внимание, в частности, что year - a[0]
в вашем случае всегда будет 0, так как присутствуют все годы (это вычисляет разницу между запрашиваемым и найденным годом). Следовательно, весь член будет равен 0, а возвращаемое значение соответствует a[1]
,
Если запрашиваемый год отсутствует, t
обозначает фактор, который описывает изменение между предыдущим годом b
и текущий год a
, Этот коэффициент изменения используется для экстраполяции прошлого a
получить значение за запрашиваемый год.