Изолинии представляют собой линии равного значения некоторой скалярной функции, определённой на двумерной области. В визуализации данных это чаще всего интерпретируется как линии одинаковой плотности распределения точек или уровней непрерывной поверхности.
В контексте визуализации данных контуры используются для:
В экосистеме Vega и Vega-Lite контурные графики реализуются через трансформации данных и декларативное описание визуальных примитивов, без необходимости ручного вычисления изолиний.
Официальная документация: Vega Vega-Lite
Контурные линии строятся на основе функции вида:
[ f(x, y) = c]
где (c) — фиксированное значение уровня.
В задачах анализа данных чаще используется оценка плотности:
[ (x, y) = _{i=1}^{n} K(, )]
где:
Контуры строятся как линии уровня этой функции.
В Vega контурная визуализация реализуется через трансформацию
contour, которая преобразует набор точек в набор
изолиний.
{
"data": { "values": [...] },
"transform": [
{
"type": "contour",
"x": "x",
"y": "y",
"size": [width, height],
"levels": 10
}
],
"mark": "line",
"encoding": {
"x": { "field": "x", "type": "quantitative" },
"y": { "field": "y", "type": "quantitative" },
"detail": { "field": "level" }
}
}
x, y
size
levels
bandwidth
Процесс включает несколько этапов:
Алгоритм marching squares является двумерным аналогом marching cubes и обеспечивает построение гладких линий на основе дискретного поля.
В Vega-Lite отсутствует низкоуровневая трансформация
contour как в Vega, однако контурные визуализации
реализуются через агрегирующие трансформации плотности.
Основные механизмы:
densitykde2d (в зависимости от версии компилятора Vega)mark: "area" или
mark: "line"Ядровая оценка плотности — ключевой метод построения изолиний плотности.
[ (x, y) = _{i=1}^{n} K_h(x - x_i, y - y_i)]
Чаще используется гауссово ядро:
[ K_h(x, y) = e^{-}]
{
"data": {
"values": [
{"x": 1, "y": 1},
{"x": 2, "y": 2},
{"x": 2, "y": 3}
]
},
"transform": [
{
"density": "x",
"extent": [0, 10],
"steps": 200,
"as": ["value", "density"]
}
],
"mark": "line",
"encoding": {
"x": {"field": "value", "type": "quantitative"},
"y": {"field": "density", "type": "quantitative"}
}
}
Хотя пример одномерный, аналогичный подход используется как базовый строительный блок для контурных поверхностей.
Для полноценной контурной карты используется подготовка двумерной сетки.
{
"transform": [
{
"type": "contour",
"x": "x",
"y": "y",
"size": [400, 300],
"bandwidth": 20,
"levels": 15
}
]
}
Каждая изолиния представляется как:
level — значение уровняcoordinates — массив точек линииtype — линия или полигонИспользуется для изолиний:
"mark": "line"
Каждая линия соответствует одному уровню плотности.
Используется для заполненных контурных карт:
"mark": "area"
Позволяет создавать «карты плотности» с заливкой между уровнями.
Контуры часто комбинируются с другими слоями:
В Vega используется layer:
{
"layer": [
{ "mark": "circle" },
{ "mark": "line", "transform": [{"type": "contour"}] }
]
}
Контуры часто усиливаются цветом:
levelПример:
"encoding": {
"color": {
"field": "level",
"type": "quantitative",
"scale": { "scheme": "viridis" }
}
}
contour transformКонтурные вычисления требуют:
Оптимизации:
Контурная визуализация преобразует дискретные точки в непрерывную поверхность, фактически аппроксимируя функцию:
Контуры пересекаются с:
В Vega эти типы часто комбинируются в layered visualization для повышения интерпретируемости.