Дискретизация числовых значений (bin) в Vega-Lite и Vega
Бинирование (binning) — преобразование непрерывной числовой шкалы в набор дискретных интервалов. В контексте Vega-Lite это один из базовых механизмов подготовки данных для визуализаций распределений, прежде всего гистограмм, тепловых карт и агрегированных диаграмм плотности.
Непрерывные данные часто слишком детализированы для прямого отображения. Например, значения возраста, дохода или времени могут принимать десятки или сотни уникальных значений. При прямом отображении:
Бинирование решает эту проблему, группируя значения в интервалы фиксированной или вычисляемой ширины.
В Vega-Lite бин задаётся прямо внутри канала поля
(encoding) с помощью свойства bin.
Минимальная форма:
{
"mark": "bar",
"encoding": {
"x": {
"field": "value",
"type": "quantitative",
"bin": true
},
"y": {
"aggregate": "count",
"type": "quantitative"
}
}
}
Здесь:
bin: true включает автоматическое разбиение
диапазона;При включении bin происходит трансформация данных:
вычисляется диапазон значений (min,
max);
диапазон делится на интервалы;
каждому значению присваивается интервал;
создаются вспомогательные поля:
bin_startbin_endЭти поля можно использовать для точного контроля отображения.
Биннинг можно настраивать явно, заменяя true
объектом.
"bin": {
"maxbins": 20
}
maxbins задаёт верхнюю границу количества интервалов.
Фактическое число может отличаться в зависимости от «красоты» шкалы.
Особенности:
"bin": {
"step": 5
}
step задаёт фиксированную ширину интервала.
Используется, когда:
"bin": {
"extent": [0, 100]
}
extent фиксирует диапазон бининга. Значения вне
диапазона могут игнорироваться или попадать в крайние интервалы.
Применение:
"bin": {
"anchor": 0
}
anchor задаёт точку привязки интервалов. Полезно, если
важно, чтобы границы bins начинались от конкретного значения.
Пример: интервалы должны быть кратны 10, начиная с 0.
"bin": {
"nice": true
}
nice включает автоматическую подгонку границ к удобным
числам.
Пример:
Классический сценарий — построение гистограммы.
{
"data": {"url": "data.csv"},
"mark": "bar",
"encoding": {
"x": {
"field": "value",
"type": "quantitative",
"bin": {"maxbins": 30}
},
"y": {
"aggregate": "count",
"type": "quantitative"
}
}
}
Ключевая идея:
x разбивается на интервалы;y считает количество элементов в каждом интервале.Vega-Lite создаёт вспомогательные поля, которые можно использовать напрямую:
{
"transform": [
{
"bin": true,
"field": "value",
"as": "binned_value"
}
]
}
В Vega (низкоуровневый слой) появляются:
binned_value_startbinned_value_endЭто позволяет:
Bin может применяться не только к оси X.
{
"mark": "rect",
"encoding": {
"x": {
"field": "x",
"type": "quantitative",
"bin": true
},
"y": {
"field": "y",
"type": "quantitative",
"bin": true
},
"color": {
"aggregate": "count"
}
}
}
Здесь:
Bin почти всегда используется вместе с агрегированием:
countsummeanmedianЛогика:
Пример:
"y": {
"field": "price",
"bin": true,
"aggregate": "mean"
}
Результат:
Bin корректно работает только с:
quantitative (числовые данные);Не применяется к:
nominal;ordinal.При биннинге Vega-Lite автоматически адаптирует шкалу:
Пример поведения:
Ошибка:
"x": {"field": "value", "bin": true},
"y": {"field": "value", "type": "quantitative"}
Проблема:
Если заданы одновременно:
step имеет приоритет;maxbins игнорируется.Если extent меньше реального диапазона данных:
Биннинг выполняется на этапе трансформации данных:
Особенности:
Хотя оба механизма создают интервалы, различия принципиальные:
bin — числовые интервалы;timeUnit — временные (дни, месяцы, годы).Пример timeUnit:
"timeUnit": "month"
Пример bin:
"bin": {"step": 10}
В Vega bin задаётся как transform:
{
"type": "bin",
"field": "value",
"as": ["start", "end"],
"maxbins": 20
}
Результат:
stepextent для нескольких датасетовЕсли в интервале нет данных:
impute или фиксированные
domain значения шкалы.Биннинг часто является скрытым, но критически важным элементом: