Экспорт визуализаций в Vega реализуется на уровне экземпляра
View, который является рантаймом исполнения спецификации.
После компиляции Vega-Lite в Vega-спецификацию весь процесс рендеринга и
последующего экспорта управляется именно этим объектом.
Ключевой принцип: экспорт выполняется не из исходной
спецификации, а из отрендеренного состояния View,
включающего вычисленные масштабы, данные, трансформации и DOM/canvas
представление.
View инкапсулирует:
Создание View обычно происходит после компиляции
Vega-Lite:
import vegaEmbed from 'vega-embed';
const spec = {
data: { values: [10, 20, 30] },
mark: "bar",
encoding: {
x: { field: "value", type: "quantitative" }
}
};
const result = await vegaEmbed('#vis', spec);
const view = result.view;
Именно view предоставляет экспортные методы.
SVG-экспорт строится на сериализации scenegraph в векторное представление. Vega генерирует полноценный SVG DOM, включая:
<path> для геометрии<text> для подписей<g> для группировки элементов<defs> для градиентов и маркеровview.toSVG()const svg = await view.toSVG();
Метод возвращает строку SVG, содержащую полную структуру визуализации.
SVG в Vega формируется не как статическая разметка, а как результат трансформации scenegraph:
1. Координатная система
2. Текстовый слой
3. Стилизация
4. Ограничения
PNG-экспорт выполняется через растеризацию Canvas-контекста. Vega сначала рендерит сцену в Canvas, затем извлекает bitmap.
view.toCanvas() и view.toImageURL()const canvas = await view.toCanvas();
или сразу получение изображения:
const pngURL = await view.toImageURL('png');
Процесс включает несколько этапов:
Экспорт PNG чувствителен к плотности пикселей:
const canvas = await view.toCanvas({
scaleFactor: 2
});
Повышение scaleFactor:
| Характеристика | SVG | PNG |
|---|---|---|
| Формат | Векторный | Растровый |
| Масштабирование | Бесконечное | Ограничено |
| Скорость | Быстрее генерация | Медленнее |
| Размер файла | Обычно меньше | Может быть больше |
| Совместимость | Зависит от SVG viewer | Универсальная |
Все методы экспорта возвращают Promise, поскольку
требуют завершённого рендеринга сцены.
await view.runAsync();
const svg = await view.toSVG();
const png = await view.toImageURL('png');
Важно учитывать, что runAsync() завершает все
dataflow-операции перед экспортом.
При динамическом обновлении данных требуется повторный прогон pipeline:
view.change('table', vega.changeset().insert(newData));
await view.runAsync();
const svg = await view.toSVG();
Scenegraph является промежуточной структурой между спецификацией и финальным изображением.
Он включает:
SVG-экспорт сериализует scenegraph напрямую, тогда как PNG проходит через Canvas-рендеринг.
SVG-экспорт часто сталкивается с проблемами:
PNG-экспорт более предсказуем, так как текст уже растеризован.
При наличии внешних изображений:
<image href="">Для многослойных спецификаций (layered charts):
<g>opacityVega-Lite не экспортирует напрямую. Перед экспортом происходит компиляция:
import { compile } from 'vega-lite';
const vgSpec = compile(vlSpec).spec;
const view = new vega.View(vega.parse(vgSpec));
После этого применяются стандартные методы:
await view.toSVG();
await view.toImageURL('png');
Размер экспорта зависит от width и height в
spec:
const spec = {
width: 800,
height: 400,
mark: "line",
data: { values: data }
};
При экспорте:
SVG:
PNG:
vega-embed предоставляет упрощённый доступ:
const result = await vegaEmbed('#vis', spec);
const svg = await result.view.toSVG();
const png = await result.view.toImageURL('png');
При этом embed автоматически управляет размерами и
контейнером, но экспорт остаётся функцией View.
SVG-строка, получаемая из toSVG(), включает:
Это позволяет сохранять визуализацию без внешних зависимостей, однако увеличивает размер выходного файла при сложных сценах.
При работе с экспортом учитываются:
Экспорт выполняется только после стабилизации состояния
View.