Пузырьковые карты представляют собой способ визуализации многомерных данных, где каждая точка на координатной плоскости отображается в виде окружности, а её дополнительные характеристики кодируются через размер, цвет, прозрачность и иногда форму. В контексте декларативной визуализации в Vega-Lite такие графики формируются через компактные спецификации, которые затем компилируются в низкоуровневую грамматику Vega.
Пузырьковая карта расширяет классическую точечную диаграмму. Если scatter plot отображает две переменные (X и Y), то пузырьковая добавляет как минимум третью:
X-ось — числовая или категориальная переменная
Y-ось — числовая переменная
Размер пузырька — количественный показатель (weight, volume, population)
Дополнительно:
В Vega-Lite пузырьковая логика строится через канал
size, который масштабируется автоматически через шкалы
(scales).
Минимальная конфигурация в Vega-Lite:
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"values": [
{"x": 1, "y": 3, "value": 10},
{"x": 2, "y": 5, "value": 30},
{"x": 3, "y": 2, "value": 20}
]
},
"mark": "circle",
"encoding": {
"x": {"field": "x", "type": "quantitative"},
"y": {"field": "y", "type": "quantitative"},
"size": {"field": "value", "type": "quantitative"}
}
}
Ключевой момент заключается в том, что mark: "circle"
задаёт примитив визуализации, а size управляет радиусом
через встроенную шкалу площади.
Размер пузырьков в Vega-Lite не является прямым радиусом. Используется площадь круга, что важно для корректного восприятия:
sizeПример явной настройки диапазона:
"size": {
"field": "value",
"type": "quantitative",
"scale": {
"range": [50, 2000]
}
}
Это позволяет контролировать минимальные и максимальные размеры пузырей, предотвращая визуальные искажения при сильно разбросанных данных.
Часто пузырьковые диаграммы используются для анализа групп:
"color": {
"field": "category",
"type": "nominal"
}
Комбинация size + color создаёт многомерную карту,
где:
При использовании непрерывных шкал цвет может кодировать интенсивность, например:
"color": {
"field": "profit",
"type": "quantitative",
"scale": {"scheme": "blues"}
}
Пузырьковые диаграммы неизбежно скрывают детализацию в визуальном слое. Tooltip компенсирует это:
"tooltip": [
{"field": "name", "type": "nominal"},
{"field": "value", "type": "quantitative"},
{"field": "category", "type": "nominal"}
]
Tooltip в Vega-Lite не требует дополнительной логики: движок автоматически связывает события наведения с данными.
Один из наиболее распространённых вариантов — географическая визуализация, где пузырьки накладываются на карту.
В Vega это реализуется через проекцию:
{
"data": {
"url": "data/world-110m.json",
"format": {"type": "topojson", "feature": "countries"}
},
"projection": {
"type": "naturalEarth1"
},
"mark": "geoshape"
}
Далее добавляется слой с пузырьками:
{
"mark": "circle",
"encoding": {
"longitude": {"field": "lon", "type": "quantitative"},
"latitude": {"field": "lat", "type": "quantitative"},
"size": {"field": "population"},
"color": {"field": "region"}
}
}
В Vega-Lite слои объединяются через layer.
Слои позволяют комбинировать:
Пример:
{
"layer": [
{
"data": {"url": "world.json", "format": {"type": "topojson"}},
"mark": "geoshape"
},
{
"mark": "circle",
"encoding": {
"longitude": {"field": "lon"},
"latitude": {"field": "lat"},
"size": {"field": "metric"},
"color": {"field": "type"}
}
}
]
}
Пузырьковые карты часто строятся на агрегированных данных.
В Vega-Lite можно использовать встроенные трансформации:
"transform": [
{
"aggregate": [
{"op": "sum", "field": "sales", "as": "total_sales"}
],
"groupby": ["region"]
}
]
После агрегации пузырьки отображают суммарные значения по регионам.
Vega-Lite поддерживает интерактивные селекторы:
"selection": {
"brush": {
"type": "interval"
}
}
И применение фильтра:
"transform": [
{"filter": {"selection": "brush"}}
]
Это позволяет выделять области пузырьковой карты и анализировать подмножества данных.
При сильной диспропорции значений линейная шкала становится неэффективной.
"size": {
"field": "value",
"type": "quantitative",
"scale": {
"type": "log"
}
}
Логарифмическое преобразование снижает влияние выбросов и делает структуру данных более читаемой.
Проблема пузырьковых диаграмм — перекрытие элементов.
Решения:
sizeopacity)Пример прозрачности:
"opacity": {"value": 0.6}
Пузырьковые диаграммы часто используются как временные срезы:
"encoding": {
"x": {"field": "date", "type": "temporal"},
"y": {"field": "value"},
"size": {"field": "volume"}
}
Это превращает график в динамическую систему наблюдения за изменениями объёмов.
Vega-Lite позволяет создавать новые признаки прямо в спецификации:
"transform": [
{
"calculate": "datum.revenue - datum.cost",
"as": "profit"
}
]
Далее этот показатель может управлять размером пузыря:
"size": {"field": "profit"}
При работе с пузырьками критически важен порядок отрисовки:
"transform": [
{"calculate": "datum.value", "as": "v"},
{"window": [{"op": "rank", "as": "rank"}]}
]
И последующая визуальная приоритизация через order.
При тысячах точек пузырьковые диаграммы требуют оптимизации:
Vega использует компиляцию в более низкоуровневую систему рендеринга, что позволяет эффективно обрабатывать сложные сцены с большим количеством объектов.
Пузырьковые карты часто становятся частью более сложных визуальных панелей:
Такие композиции реализуются через реактивные зависимости между сигналами и данными в Vega или через declarative bindings в Vega-Lite.