Есть действительно хороший пост, который кто-то собрал об использовании canvas, под названием Работа с D3.js и Canvas .
Короче говоря, я бы порекомендовал сделать привязку данных к некоторому фиктивному HTML и использовать результаты этого для визуализации вашего вывода.
Сначала создайте поддельный элемент DOM, который вы можете использовать
const fakeContainer = d3.select(document.createElement("custom"));
Теперь привязайте данные к нему. Обратите внимание, что создайте его только один раз, повторно используйте для повторного рендеринга.
const join = fakeContainer
.selectAll("circle")
.data(myData);
join.exit().remove();
join.enter().append("circle");
Тогда, когда дело доходит до рендеринга:
fakeContainer.each(function(d) {
// Render a canvas circle
});