Очевидно, что вам нужен источник для целевых данных, который может быть глобальной картой или полем в ваших данных.
Я создал пример , который извлекает данные из глобала, но он также берет данные, если сокращение вашей группы предоставляет поле с именем target
.
Затем он добавляет новый элемент path
в каждую строку. Удобно, что строки уже являются SVG g
групповыми элементами , поэтому все, что там вставлено, уже будет смещено в верхний левый угол прямоугольника строки.
Единственная координата, которую нам не хватает, это высота прямоугольника, которую мы можем получить, прочитав ее с одного из существующих столбцов:
var height = chart.select('g.row rect').attr('height');
Затем мы выбираем g
s и используем общий шаблон обновления, чтобы добавить path.target
к каждому из них, если у него его нет. Мы сделаем его красным, сделаем его видимым, только если у нас есть данные для этой строки, и начнем с X 0, чтобы он анимировался слева, как это делают строки:
var target = chart.selectAll('g.row')
.selectAll('path.target').data(function(d) { return [d]; });
target = target.enter().append('path')
.attr('class', 'target')
.attr('stroke', 'red')
.attr('visibility', function(d) {
return (d.value.target !== undefined || _targets[d.key] !== undefined) ? 'visible' : 'hidden';
})
.attr('d', function(d) {
return 'M0,0 v' + height;
}).merge(target);
Финал .merge(target)
объединяет этот выбор с основным.
Теперь мы можем анимировать все целевые линии в положение:
target.transition().duration(chart.transitionDuration())
.attr('visibility', function(d) {
return (d.value.target !== undefined || _targets[d.key] !== undefined) ? 'visible' : 'hidden';
})
.attr('d', function(d) {
return 'M' + (chart.x()(d.value.target || _targets[d.key] || 0)+0.5) + ',0 v' + height;
});
В примере это не показано, но это также позволит целям динамически перемещаться в случае их изменения или изменения масштаба. Точно так же цели могут также стать видимыми или невидимыми, если данные добавлены / удалены.