Загрузка данных по URL является одним из ключевых механизмов работы Vega и Vega-Lite, поскольку позволяет отделить описание визуализации от источника данных и обеспечивает динамическое обновление графиков без изменения спецификации. В основе лежит декларативное описание источника данных, где сам процесс загрузки делегируется движку Vega.
В Vega и Vega-Lite данные могут поступать из нескольких источников, но наиболее распространённый сценарий — указание внешнего ресурса через URL. В этом случае движок выполняет HTTP(S)-запрос, загружает файл, интерпретирует его в соответствии с указанным форматом и передаёт в конвейер обработки данных.
Ключевое поле:
data: {
url: "https://example.com/data.csv"
}
Минимальная спецификация подразумевает, что Vega самостоятельно определяет формат по расширению файла, однако в реальных проектах формат всегда задаётся явно для предсказуемости поведения.
Поддерживаются основные табличные и структурированные форматы: JSON, CSV, TSV.
data: {
url: "https://example.com/data.json",
format: {
type: "json"
}
}
JSON-формат используется по умолчанию для иерархических данных. Vega ожидает массив объектов или структурированное дерево, в зависимости от задачи визуализации.
data: {
url: "https://example.com/data.csv",
format: {
type: "csv"
}
}
CSV обрабатывается как табличный набор данных, где каждая строка преобразуется в объект, а заголовки первой строки становятся именами полей.
data: {
url: "https://example.com/data.tsv",
format: {
type: "tsv"
}
}
TSV используется реже, но обеспечивает более стабильную обработку текстовых данных, содержащих запятые.
Загрузка данных через URL почти всегда сопровождается преобразованием структуры до этапа визуализации. Vega предоставляет встроенные трансформации, которые применяются сразу после загрузки.
data: {
url: "https://example.com/data.csv",
format: { type: "csv" },
transform: [
{
type: "filter",
expr: "datum.value > 10"
}
]
}
Трансформации выполняются в строгом порядке, формируя цепочку обработки: загрузка → парсинг → преобразование → визуализация.
Vega использует явную декларацию источников данных, где URL является частью низкоуровневого описания графика. Каждое преобразование и этап обработки задаётся вручную.
{
"data": [
{
"name": "table",
"url": "https://example.com/data.json",
"format": { "type": "json" }
}
]
}
Данные именуются и могут использоваться в нескольких слоях визуализации.
Vega-Lite упрощает модель, автоматически создавая внутренние
структуры Vega. Загрузка данных осуществляется через поле
data.url, при этом система сама управляет именованием и
потоками данных.
{
"data": {
"url": "https://example.com/data.csv"
},
"mark": "bar",
"encoding": {
"x": { "field": "category", "type": "nominal" },
"y": { "field": "value", "type": "quantitative" }
}
}
При загрузке данных по URL Vega выполняет стандартный HTTP-запрос через браузерный механизм fetch/XHR. Это означает, что применяются ограничения CORS.
Если сервер не возвращает заголовки:
Access-Control-Allow-Origin
загрузка будет заблокирована на уровне браузера.
В контексте Vega это проявляется как отсутствие данных без явной ошибки в спецификации. Поэтому источники данных должны быть либо:
Vega использует внутренний кэш загрузчика данных. Повторные обращения к одному и тому же URL могут не приводить к повторному сетевому запросу, если данные уже были загружены в рамках текущего сеанса визуализации.
Это особенно важно при работе с:
URL может формироваться динамически на основе сигналов (signals) в Vega:
data: {
url: {
signal: "'https://example.com/data?year=' + year"
}
}
Это позволяет параметризовать запросы и загружать разные наборы данных без изменения основной спецификации визуализации.
Типичные сценарии:
При невозможности загрузки ресурса Vega фиксирует ошибку на этапе data loading. Причины могут включать:
Внутренне движок прекращает дальнейшую обработку цепочки данных, и визуализация остаётся пустой или частично отрисованной, в зависимости от структуры spec.
Некоторые форматы поддерживают дополнительные опции парсинга.
data: {
url: "https://example.com/data.csv",
format: {
type: "csv",
delimiter: ";"
}
}
data: {
url: "https://example.com/data.json",
format: {
type: "json",
property: "items"
}
}
Это позволяет извлекать данные из вложенных структур без предварительной обработки на сервере.
Vega поддерживает обновление данных по URL через повторную загрузку или внешние сигналы. Хотя базовая спецификация не предусматривает WebSocket как источник напрямую, возможно периодическое обновление через внешние механизмы интеграции.
Пример концептуального обновления:
view.runAsync()
.then(v => v.data("table").url("https://example.com/new-data.csv"))
.then(v => v.run());
Загрузка данных по URL подчиняется ограничениям среды выполнения:
file:// в большинстве
окруженийЭто делает поведение загрузки предсказуемым, но требует явной настройки инфраструктуры.
При работе с крупными наборами данных важны следующие факторы:
Типичная оптимизация заключается в сокращении объёма данных до минимально необходимого перед передачей в Vega.
Одна спецификация может содержать несколько URL-источников:
data: [
{
name: "sales",
url: "https://example.com/sales.csv",
format: { type: "csv" }
},
{
name: "regions",
url: "https://example.com/regions.json",
format: { type: "json" }
}
]
Такая модель позволяет выполнять join-операции и сложные визуальные корреляции между наборами данных.
После загрузки данные становятся доступными через имя источника и могут использоваться в различных mark-слоях.
{
"data": {
"url": "https://example.com/data.csv"
},
"mark": "line",
"encoding": {
"x": { "field": "date", "type": "temporal" },
"y": { "field": "value", "type": "quantitative" }
}
}
Поля автоматически приводятся к внутренним типам Vega-Lite, если это возможно, иначе остаются строковыми.
После загрузки данных Vega выполняет автоматическую типизацию:
quantitativetemporalnominalОднако при некорректных данных автоматическое определение может привести к ошибкам визуализации, поэтому часто используется явное указание типа поля в encoding.
Процесс загрузки по URL в Vega можно рассматривать как последовательность этапов: