Я пытаюсь обновить сложенную гистограмму с переходами при изменении базовых данных. Он каждый раз вызывает одну и ту же функцию «рендеринга» и хорошо работает, когда не задействованы никакие переходы. Однако я хотел бы оживить изменения в значениях, переходя от своего текущего состояния к другому.D3.js анимационное обновление сложенной гистограммы
Я немного решил проблему, но чувствую, что мое решение неуклюже - надеясь, что есть лучший способ сделать это для штабелированных гистограмм.
Мой подход был сделать следующее: (. REQ для переходов)
- загрузить данные
- нагрузки начальных условий
- нагрузку конечных условий (в пределах перехода)
- Скопируйте текущие данные в другой массив: prevData
- Обновить данные после интервала
Использование вышеуказанного подхода, если prevData имеет значения, затем используйте их для установки начальных условий. Мои проблемы в том, что поиск и установка начальных условий чувствует себя очень неуклюжим:
if (prevData.length > 0) {
//get the parent key so we know who's data we are now updating
var devKey = d3.select(this.parentNode).datum().key;
//find the data associated with its PREVIOUS value
var seriesData = seriesPrevData.find(function (s) { return (s.key == devKey); })
if (seriesData != null) {
//now find the date we are currently looking at
var day = seriesData.find(function (element) { return (element.data.Date.getTime() == d.data.Date.getTime()); });
if (day != null) {
//now set the value appropriately
//console.debug("prev height:" + devKey + ":" + day[1]);
return (y(day[0]) - y(day[1]));
}
}
}
Все, что я делаю, это найти правильный ключ массив (созданный d3.stack()), а затем пытается найти соответствующий предыдущий ввод данных (если он существует). Однако поиск исходных узлов и поиск по массивам для поиска требуемого ключа и соответствующего элемента данных очень затянуты.
Итак, мой вопрос в том, есть ли лучший способ сделать это? или части этого?
- Найти ранее связанных значений данных, связанных с этим элементом или текущих значений до того, как изменяется в пределах функции.
- Лучше всего найти текущий ключ, а не использовать: d3.select (this.parentNode) ...? Я пробовал передавать ключевые значения, но, похоже, не понимаю. Лучшее, что я достиг, - это передать ключевую функцию родителям и найти его так, как описано выше.
Извините за длинный пост, я просто потратил целый день на разработку своего решения, разочаровавшись в том, что все, что мне действительно нужно, это предыдущие значения элемента. Имея, чтобы сделать все эти «гимнастику», чтобы получить то, что мне нужно было, кажется, очень «ип» D3.js как :-)
Благодарности
Я не уверен, что я понял вашу проблему. Тем более, почему вы делаете некоторые явные текущие/предыдущие подготовки данных, для меня непонятно.В принципе, нужно обрабатывать данные в d3 и затем использовать методы «enter» и «exit» для обработки дополнительных или удаленных данных. Я не вижу необходимости вручную составлять данные здесь. – pintxo
данные должны быть подготовлены для обработки анимаций. Поскольку D3 требует начального и конечного состояния, чтобы сделать анимацию, когда данные перезагружаются, мне нужно установить начальное состояние столбцов на то, что было раньше, прежде чем позволить привязке установить окончательное (обновленное) состояние. есть ли другой способ выполнения переходов? –