Это хороший пример, где может быть реализовано множество вариантов ввода / обновления / выхода d3.
Да, я согласен: воссоздание графика для каждого изменения не является хорошим решением.
Хорошо, вот вам вилка вашего Plunkr с использованием методов ввода / обновления / слияния / выхода .
http://plnkr.co/edit/2v8YQoZSClhKpW2U1pwi?p=preview
Предварительный просмотр того, как я получил слияние выбор сделан: возьмем rowLabels
например:
// make region labels
var rowLabels = rowLabelGroup
.selectAll('text.rowLabel')
.data(yLabelsNames);
// ENTER SELECTION FOR COL LABELS
// ENTER + UPDATE
// After merging the entered elements with the update selection,
// apply operations to both.
rowLabels
.enter().append('text').attr('class', 'rowLabel mono')
.attr('font-weight', 'normal')
.style('text-anchor', 'end')
.on('mouseover', function(d) {
d3.select(this).attr('font-weight', 'bold').style('fill', 'red');
})
.on('mouseout', function(d) {
d3.select(this).attr('font-weight', 'normal').style('fill', 'black');
})
.attr('x', 0)
.attr('y', function(d, i) {
return i * cellSize;
})
.attr('transform', function(d, i) {
return 'translate(-3, 11)';
})
.merge(rowLabels)
.attr('name', function(d) {
return d;
})
.text(function(d) {
return d;
})
.attr('id', function(d) {
return 'rowLabel_' + yLabelsNames.indexOf(d);
})
.attr('label-r', function(d) {
return yLabelsNames.indexOf(d);
});
// exit/remove elements which are no longer in use
rowLabels.exit().remove();
Аналогично, эти методы были применены к colLabels
, cells
и sparkLineSvgs
, как вы можете заметитьв коде.
А что касается добавления SVG, я переместил этот код в вне функции updateHeatmap
.И да, кстати, я изменил название функции с createHeatmap
на updateHeatmap
.
И я столкнулся с проблемой при наведении курсора на всплывающую подсказку, то есть всплывающая подсказка много раз.Чтобы противостоять этому, я добавил pointer-events:none
к .d3-tip
подсказке.
Пройдите через код и дайте мне знать, если я что-то пропустил или у вас возникли проблемы с пониманием какой-либо части.
Надеюсь, это поможет.