Дот-плот представляет собой диаграмму распределения, в которой каждое наблюдение отображается отдельной точкой. В отличие от гистограммы, где данные агрегируются в интервалы, дот-плот сохраняет исходные значения без потери детализации, позволяя анализировать плотность, выбросы и структуру распределения.
В контексте Vega и Vega-Lite дот-плот строится на основе mark
point (Vega-Lite) или symbol (Vega), а
ключевым механизмом позиционирования становится сочетание осевых каналов
и преобразований данных: jitter, binning, stacking или force-layout.
Минимальный дот-плот строится через:
mark: "point"Типичный случай — распределение значений по оси X:
{
"data": {"values": [
{"value": 5}, {"value": 6}, {"value": 6},
{"value": 7}, {"value": 8}, {"value": 8}
]},
"mark": "point",
"encoding": {
"x": {
"field": "value",
"type": "quantitative",
"bin": true
},
"y": {"value": 0}
}
}
Однако такой вариант лишь агрегирует данные по бинам и не является
полноценным дот-плотом с сохранением каждой точки в пространстве. Более
корректная форма использует yOffset или
jitter.
Jitter применяется для предотвращения наложения точек при одинаковых
значениях. В Vega-Lite это достигается через transform или
yOffset.
{
"data": {"values": [
{"group": "A", "value": 10},
{"group": "A", "value": 10},
{"group": "A", "value": 11},
{"group": "A", "value": 12},
{"group": "B", "value": 10},
{"group": "B", "value": 11}
]},
"mark": "circle",
"encoding": {
"x": {
"field": "value",
"type": "quantitative"
},
"y": {
"field": "group",
"type": "nominal"
},
"yOffset": {
"value": 0
},
"opacity": {"value": 0.7}
},
"transform": [
{
"calculate": "random() * 10 - 5",
"as": "jitter"
}
]
}
Однако Vega-Lite не всегда напрямую применяет jitter как
позиционный канал. Часто используется комбинация yOffset
через выражения или переход к Vega-level specification.
Beeswarm (или swarm plot) — это форма дот-плота, где точки не просто случайно смещаются, а упорядочиваются так, чтобы:
Главное отличие от jitter:
Beeswarm основан на моделировании ограничений:
В Vega (не Lite) это часто реализуется через
force simulation.
Vega поддерживает физическую симуляцию:
Пример концептуальной структуры:
{
"data": {
"values": [
{"value": 10}, {"value": 10}, {"value": 11},
{"value": 12}, {"value": 12}, {"value": 13}
]
},
"marks": [
{
"type": "symbol",
"from": {"data": "table"},
"encode": {
"enter": {
"x": {"scale": "x", "field": "value"},
"y": {"value": 200},
"size": {"value": 100},
"fill": {"value": "steelblue"}
},
"update": {
"x": {"field": "vx"},
"y": {"field": "vy"}
}
}
}
],
"scales": [
{
"name": "x",
"type": "linear",
"domain": {"data": "table", "field": "value"},
"range": "width"
}
],
"forces": [
{
"force": "x",
"x": "x"
},
{
"force": "collision",
"radius": 5
}
]
}
Здесь ключевым является collision force, который предотвращает наложение точек и формирует характерную «пчелиное рой» структуру.
Vega-Lite не реализует полноценную физическую симуляцию, поэтому используются альтернативные стратегии:
{
"mark": "circle",
"encoding": {
"x": {"field": "value", "type": "quantitative"},
"y": {
"field": "category",
"type": "nominal"
}
},
"transform": [
{
"calculate": "(random() - 0.5) * 20",
"as": "jitterY"
}
]
}
Ограничение: отсутствует контроль коллизий.
Часто применяется комбинированный подход:
{
"mark": "circle",
"encoding": {
"x": {"field": "value", "type": "quantitative"},
"y": {"field": "group", "type": "nominal"},
"yOffset": {"field": "stackPos"}
},
"transform": [
{
"bin": true,
"field": "value",
"as": "binned"
},
{
"window": [
{"op": "rank", "as": "stackPos"}
],
"groupby": ["binned", "group"]
}
]
}
Такой подход создаёт псевдо-beeswarm через упорядочивание внутри бинов.
В обеих диаграммах визуальные каналы усиливают интерпретацию:
opacity — уменьшает визуальный шум при высокой
плотностиsize — кодирует вес или частотуcolor — различает группы или категорииПример:
"mark": {
"type": "circle",
"opacity": 0.6,
"size": 60
}
При больших наборах данных возникает проблема:
Решения:
{
"transform": [
{
"sample": 1000
}
]
}
mark: "area" +
mark: "circle"Расширенная версия beeswarm включает оценку плотности:
В Vega это может моделироваться через:
size или yOffsetКлючевые принципы:
Упрощённая логика:
Beeswarm можно рассматривать как задачу упаковки окружностей в ограниченной полосе:
Это приближает задачу к:
Основные трансформации, используемые при создании дот-плотов:
bin — разбиение диапазонаstack — накопительное размещениеwindow — ранжирование и порядковые вычисленияcalculate — генерация jitter или координатdensity (в расширениях) — оценка распределенияКомбинация этих трансформаций позволяет строить как простые dot plots, так и приближённые beeswarm визуализации без выхода за пределы декларативного подхода.
Beeswarm и dot plot опираются на свойства зрительной системы:
Это делает такие диаграммы особенно эффективными для: