Расширение путей в D3 с переходом

Я боролся с проблемами, связанными с переходами в D3. Рассмотрим этот код:

svg.selectAll("path")
  .data(data, key)
  .enter().append("path")
  .attr("d", someFunctionThatReturnsAPath);
});

И через несколько секунд я вызываю следующее в setTimeout:

svg.selectAll("path")
  .transition()
  .duration(2000)
  .attr("d", someFunctionThatReturnsADifferentPath);
});

Второй вызов правильно обновляет пути, но не анимирует переход. Почему нет перехода, когда атрибут d обновляется во втором вызове?

Обратите внимание, что пути очень сложные. В обоих вызовах есть заметная задержка перед тем, как пути будут фактически отрисованы. Может быть, это связано с отсутствием перехода?

Я новичок в D3, но я читал о переходах и не могу понять, почему это ведет себя не так, как я ожидаю.


Обновить

Согласно ответу @Marjancek, я предоставляю более подробную информацию о двух вызываемых функциях.

Вот определение someFunctionThatReturnsAPath:

function(d) {
  var coordinates = [];

  for (var i = d.track.length - 1; i >= 0; i--) {
    // We only care about the last 10 elements
    if (coordinates.length >= 10)
      break;
    coordinates.push(d.track[i]);
  }
  return path({type: "LineString", coordinates: coordinates});
};

И someFunctionThatReturnsADifferentPath:

function(d) {
  var coordinates = [];

  for (var i = d.track.length - 1; i >= 0; i--) {
    // We only care about the last 20 elements
    if (coordinates.length >= 20)
      break;
    coordinates.push(d.track[i]);
  }
  return path({type: "LineString", coordinates: coordinates});
};

где путь определяется следующим образом (projection равно d3.geo.albersUsa()):

var path = d3.geo.path()
  .projection(projection);

Цель состоит в том, чтобы при втором вызове линия была расширена на 10 новых точек данных.


person David Chouinard    schedule 23.03.2013    source источник


Ответы (2)


Если ваши пути не имеют одинакового количества точек, переходы могут работать не так, как ожидалось. Попробуйте .attrTween: http://github.com/mbostock/d3/wiki/Transitions#wiki-attrTween Пример есть на bl.ocks.org, но сайт в данный момент не работает, поэтому я не могу дать ссылку на него.

Добавлено при редактировании: Суть, о которой я думал, была: http://gist.github.com/mbostock/3916621 ссылка bl.ocks будет http://bl.ocks.org/mbostock/3916621 при резервном копировании сайта.

person Andrew Staroscik    schedule 23.03.2013
comment
Отлично, спасибо за указатель. GitHub был недоступен ранее, поэтому, вероятно, не работал bl.ocks.org. У тебя случайно нет ссылки сейчас? - person David Chouinard; 24.03.2013
comment
Я добавил ссылки в ответ - person Andrew Staroscik; 24.03.2013

Это невозможно узнать, не глядя на ваш someFunctionThatReturnsADifferentPath; но я предполагаю, что ваша функция Different не учитывает интерполяцию из трех полученных параметров.

Прочтите документацию по переходам: https://github.com/mbostock/d3/wiki/Transitions

person Marjancek    schedule 23.03.2013
comment
Я обновил свой вопрос с уточнениями, которые вы запросили. Я уже прочитал хороший кусок этой документации, но я прочитаю ее более тщательно. - person David Chouinard; 23.03.2013