Дот-плот и beeswarm

Дот-плот представляет собой диаграмму распределения, в которой каждое наблюдение отображается отдельной точкой. В отличие от гистограммы, где данные агрегируются в интервалы, дот-плот сохраняет исходные значения без потери детализации, позволяя анализировать плотность, выбросы и структуру распределения.

В контексте Vega и Vega-Lite дот-плот строится на основе mark point (Vega-Lite) или symbol (Vega), а ключевым механизмом позиционирования становится сочетание осевых каналов и преобразований данных: jitter, binning, stacking или force-layout.


Базовая структура дот-плота в Vega-Lite

Минимальный дот-плот строится через:

  • 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 (разброс точек)

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 диаграмма как развитие дот-плота

Beeswarm (или swarm plot) — это форма дот-плота, где точки не просто случайно смещаются, а упорядочиваются так, чтобы:

  • минимизировать перекрытия
  • сохранить плотность распределения
  • сформировать “органическую” структуру вокруг центральной оси

Главное отличие от jitter:

  • jitter — случайный шум
  • beeswarm — детерминированная упаковка точек

Логика beeswarm layout

Beeswarm основан на моделировании ограничений:

  1. каждая точка имеет фиксированную координату по оси X (или Y)
  2. по другой оси применяется смещение
  3. точки не должны пересекаться
  4. алгоритм стремится минимизировать отклонение от центральной линии

В Vega (не Lite) это часто реализуется через force simulation.


Beeswarm через Vega force transform

Vega поддерживает физическую симуляцию:

  • силы отталкивания (collision)
  • центростремительные силы
  • ограничение по одной оси

Пример концептуальной структуры:

{
  "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, который предотвращает наложение точек и формирует характерную «пчелиное рой» структуру.


Beeswarm в Vega-Lite: ограничения и подходы

Vega-Lite не реализует полноценную физическую симуляцию, поэтому используются альтернативные стратегии:

1. Jitter-аппроксимация

{
  "mark": "circle",
  "encoding": {
    "x": {"field": "value", "type": "quantitative"},
    "y": {
      "field": "category",
      "type": "nominal"
    }
  },
  "transform": [
    {
      "calculate": "(random() - 0.5) * 20",
      "as": "jitterY"
    }
  ]
}

Ограничение: отсутствует контроль коллизий.


2. Binning + stacking

Часто применяется комбинированный подход:

  • X — количественная переменная
  • Y — категории
  • внутри категории выполняется плотностное распределение
{
  "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 через упорядочивание внутри бинов.


Dot plot vs Beeswarm: структурные различия

Дот-плот

  • фиксированная ось распределения
  • точки могут перекрываться
  • визуально подчёркивает дискретные значения

Beeswarm

  • динамическое размещение точек
  • исключает перекрытия
  • лучше показывает плотность распределения
  • требует layout-алгоритма

Использование opacity, size и color

В обеих диаграммах визуальные каналы усиливают интерпретацию:

  • opacity — уменьшает визуальный шум при высокой плотности
  • size — кодирует вес или частоту
  • color — различает группы или категории

Пример:

"mark": {
  "type": "circle",
  "opacity": 0.6,
  "size": 60
}

Агрегация и предотвращение перегрузки

При больших наборах данных возникает проблема:

  • тысячи точек перекрываются
  • производительность снижается
  • визуальная структура становится нечитаемой

Решения:

1. Sampling

{
  "transform": [
    {
      "sample": 1000
    }
  ]
}

2. Aggregation + overlay

  • поверх дот-плота добавляется density estimation
  • используется комбинация mark: "area" + mark: "circle"

Density beeswarm как гибридный подход

Расширенная версия beeswarm включает оценку плотности:

  • KDE (kernel density estimation)
  • адаптивное распределение точек
  • изменение расстояний между точками в зависимости от локальной плотности

В Vega это может моделироваться через:

  • precomputed density field
  • encoding через size или yOffset

Практика построения устойчивого beeswarm

Ключевые принципы:

  • фиксировать основную ось (value axis)
  • использовать deterministic layout вместо random jitter
  • ограничивать максимальное смещение
  • учитывать радиус точек при расчёте коллизий

Упрощённая логика:

  1. сортировка по значению
  2. размещение точки на центральной линии
  3. проверка пересечений с уже размещёнными
  4. смещение вверх/вниз до отсутствия коллизий

Геометрическая интерпретация

Beeswarm можно рассматривать как задачу упаковки окружностей в ограниченной полосе:

  • каждая точка — окружность радиуса r
  • ось данных — фиксированная координата
  • вторичная ось — оптимизационная переменная
  • ограничение — отсутствие пересечений

Это приближает задачу к:

  • packing problem
  • constraint optimization
  • force-directed graph layout

Роль Vega transforms в построении распределений

Основные трансформации, используемые при создании дот-плотов:

  • bin — разбиение диапазона
  • stack — накопительное размещение
  • window — ранжирование и порядковые вычисления
  • calculate — генерация jitter или координат
  • density (в расширениях) — оценка распределения

Комбинация этих трансформаций позволяет строить как простые dot plots, так и приближённые beeswarm визуализации без выхода за пределы декларативного подхода.


Сравнение подходов реализации beeswarm

Vega-Lite (декларативный уровень)

  • проще спецификация
  • ограниченные layout-возможности
  • jitter и window-based stacking

Vega (низкоуровневый)

  • force simulation
  • контроль коллизий
  • точное управление позиционированием
  • возможность реализации полноценного beeswarm

Закономерности визуального восприятия

Beeswarm и dot plot опираются на свойства зрительной системы:

  • плотность точек воспринимается как распределение вероятности
  • локальные скопления интерпретируются как кластеры
  • пустоты сигнализируют о редких значениях

Это делает такие диаграммы особенно эффективными для:

  • анализа распределений
  • поиска выбросов
  • сравнения групповых структур