В библиотеках визуализации Vega и Vega-Lite параметр
renderer определяет технологию отрисовки графики в
браузере. Доступны два основных варианта: SVG и
Canvas. Выбор между ними влияет на производительность,
масштабируемость, качество отрисовки текста и поведение интерактивных
элементов.
SVG (Scalable Vector Graphics) представляет собой DOM-ориентированную модель визуализации, где каждый графический элемент — это отдельный узел в дереве документа.
SVG-рендерер создаёт графику через стандартные элементы:
<rect><circle><path><text>Каждый элемент остаётся частью DOM, что делает его доступным для CSS-стилей и событий браузера.
SVG-рендерер обладает следующими характеристиками:
Высокая чёткость на любых масштабах Векторная природа гарантирует отсутствие пикселизации при увеличении масштаба.
Удобная интеграция с DOM Элементы можно стилизовать через CSS и отслеживать через стандартные события браузера.
Относительно высокая стоимость при большом количестве элементов При тысячах и десятках тысяч узлов производительность резко падает из-за нагрузки на DOM.
Хорошая поддержка accessibility Элементы остаются семантически частью документа.
Основные проблемы проявляются при увеличении сложности сцены:
Canvas использует растровую модель отрисовки через
<canvas> элемент, где вся сцена рисуется в одном
bitmap-слое.
Canvas работает через API 2D-контекста:
Canvas-рендерер оптимизирован для больших объёмов данных:
Высокая производительность при больших датасетах Тысячи и миллионы точек обрабатываются значительно быстрее, чем в SVG.
Меньшая нагрузка на DOM Отсутствуют тысячи узлов, вся сцена — один элемент.
Гибкость при сложной визуализации Подходит для динамических сцен, плотных scatter plot, heatmap и потоковых данных.
Более сложное взаимодействие с элементами Нет прямого доступа к объектам сцены; требуется hit-testing.
SVG:
Canvas:
SVG:
Canvas:
SVG:
Canvas:
SVG:
Canvas:
В Vega-Lite выбор рендерера задаётся через объект конфигурации:
const spec = {
data: { url: "data.csv" },
mark: "circle",
encoding: {
x: { field: "x", type: "quantitative" },
y: { field: "y", type: "quantitative" }
},
config: {
renderer: "canvas"
}
};
В Vega (низкоуровневый слой) параметр задаётся при инициализации View:
const view = new vega.View(vega.parse(spec))
.renderer("svg")
.initialize("#vis")
.run();
Vega компилирует декларативное описание в внутреннее представление сцен (scenegraph). Дальнейшее поведение зависит от выбранного backend:
Интерактивность в Vega (tooltip, selection, brush, zoom) ведёт себя по-разному:
SVG:
Canvas:
SVG демонстрирует лучшие результаты в случаях:
Canvas становится предпочтительным при:
В сложных приложениях часто применяется комбинированная стратегия:
Также встречается динамический переключатель renderer:
SVG автоматически адаптируется к DPI без дополнительных настроек.
Canvas требует учёта devicePixelRatio:
Без этого визуализация теряет чёткость при увеличении масштаба экрана.
Renderer является конечным слоем pipeline:
Таким образом, выбор рендерера не влияет на семантику данных или трансформации, но определяет способ визуального представления и стоимость рендеринга на стороне клиента.