Скрипичная диаграмма представляет собой расширение ящичной диаграммы (box plot), объединённое с оценкой плотности распределения данных. В контексте визуализации данных в Vega и Vega-Lite она используется для отображения формы распределения числовой переменной в различных категориях, сочетая в себе элементы ядерной оценки плотности (KDE) и симметричного отображения вокруг центральной оси.
Основой violin plot является сглаженная функция плотности распределения. Она зеркально отражается относительно вертикальной или горизонтальной оси, образуя характерный «силуэт», напоминающий музыкальный инструмент.
Ключевые компоненты:
В Vega-Lite violin plot обычно реализуется через трансформации данных, включающие оценку плотности и последующее построение симметричной области.
Базовая концепция состоит из двух шагов:
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"values": [
{"group": "A", "value": 10},
{"group": "A", "value": 12},
{"group": "A", "value": 14},
{"group": "B", "value": 20},
{"group": "B", "value": 22},
{"group": "B", "value": 25}
]
},
"transform": [
{
"density": "value",
"groupby": ["group"],
"extent": [0, 30]
}
],
"mark": {
"type": "area"
},
"encoding": {
"x": {
"field": "value",
"type": "quantitative"
},
"y": {
"field": "density",
"type": "quantitative"
},
"color": {
"field": "group",
"type": "nominal"
}
}
}
В этом примере используется трансформация density,
которая генерирует значения плотности для каждой группы. Однако такой
вариант пока не даёт симметричной формы — он представляет только
половину распределения.
Для получения классического violin plot требуется зеркальное отображение плотности. В Vega-Lite это достигается через дублирование данных и смещение по оси.
{
"$schema": "https://vega.github.io/schema/vega-lite/v5.json",
"data": {
"values": [
{"group": "A", "value": 10},
{"group": "A", "value": 12},
{"group": "A", "value": 14},
{"group": "A", "value": 16},
{"group": "B", "value": 20},
{"group": "B", "value": 22},
{"group": "B", "value": 24},
{"group": "B", "value": 26}
]
},
"transform": [
{
"density": "value",
"groupby": ["group"],
"extent": [0, 30]
},
{
"calculate": "-datum.density",
"as": "density_neg"
}
],
"mark": "area",
"encoding": {
"x": {
"field": "value",
"type": "quantitative",
"scale": {"zero": false}
},
"y": {
"field": "density",
"type": "quantitative"
},
"y2": {
"field": "density_neg"
},
"color": {
"field": "group",
"type": "nominal"
}
}
}
Здесь ключевую роль играет вычисляемое поле density_neg,
создающее зеркальную часть распределения.
Vega предоставляет более гибкий контроль над построением violin plot через явные вычисления и примитивы.
Основные этапы:
Пример концептуальной структуры:
{
"data": [{"name": "table"}],
"transform": [
{
"type": "kde",
"field": "value",
"bandwidth": 1.5
}
],
"marks": [
{
"type": "area",
"from": {"data": "table"},
"encode": {
"enter": {
"x": {"scale": "x", "field": "value"},
"y": {"scale": "y", "field": "density"},
"y2": {"scale": "y", "value": 0}
}
}
}
]
}
Vega позволяет более точно контролировать форму распределения, но требует ручной настройки симметрии и масштабирования.
Плотность распределения вычисляется по формуле:
Типичные ядра:
В Vega/Vega-Lite используется встроенная реализация, скрывающая математическую часть, но параметры bandwidth напрямую влияют на форму:
Часто скрипичная диаграмма дополняется элементами box plot для отображения статистических характеристик:
Такой гибрид повышает интерпретируемость распределения.
Пример наложения слоёв:
{
"layer": [
{
"mark": "area",
"encoding": {
"x": {"field": "value", "type": "quantitative"},
"y": {"field": "density", "type": "quantitative"}
}
},
{
"mark": "rule",
"encoding": {
"x": {"aggregate": "median", "field": "value"},
"size": {"value": 2}
}
}
]
}
При работе с несколькими группами violin plot становится инструментом сравнения распределений.
Особенности:
Типичная ошибка — нормализация каждой группы отдельно, что скрывает различия в объёме данных.
Ширина violin plot может интерпретироваться двумя способами:
В Vega-Lite это управляется через:
stacknormalizeКлючевые параметры визуализации:
stroke — контур областиfill — цвет распределенияopacity — прозрачностьinterpolate — тип сглаживания (monotone, basis и
др.)Пример стилизации:
{
"mark": {
"type": "area",
"opacity": 0.6,
"interpolate": "monotone"
}
}
Несмотря на гибкость, существуют ограничения:
Vega поддерживает интерактивные элементы, которые могут быть добавлены к violin plot:
Пример селекции:
"selection": {
"grid": {
"type": "interval",
"bind": "scales"
}
}
Скрипичная диаграмма особенно эффективна в задачах:
| Характеристика | Box plot | Violin plot |
|---|---|---|
| Медиана | Да | Да (опционально) |
| Квартили | Да | Да (опционально) |
| Форма распределения | Нет | Да |
| Плотность | Нет | Да |
| Интерпретация | Простая | Более детальная |
Violin plot можно рассматривать как:
Формально:
При малом числе наблюдений:
В таких случаях violin plot может вводить в заблуждение, визуально создавая ложную «структуру» распределения.
При больших наборах данных:
Особенно критично при интерактивных дашбордах с десятками тысяч точек.
Violin plot фактически является визуализацией эмпирической оценки плотности распределения, что связывает его с:
Форма диаграммы может интерпретироваться как приближение функции вероятности наблюдаемой переменной.