Шкала threshold

Шкала threshold в Vega-Lite и Vega представляет собой дискретное отображение непрерывного числового диапазона в заранее заданные категории значений на основе набора порогов. Она применяется тогда, когда требуется не плавная интерполяция, а разбиение данных на интервалы с фиксированными границами и сопоставление каждому интервалу собственного визуального значения — чаще всего цвета, но также и размеров, символов или других визуальных параметров.


Шкала threshold реализует функцию разбиения числовой оси на сегменты:

  • задаётся массив порогов domain
  • задаётся массив значений range
  • каждое значение из данных сравнивается с порогами
  • выбирается соответствующий интервал

Формально:

  • если значение x < d1 → используется r0
  • если d1 ≤ x < d2 → используется r1
  • если x ≥ dn → используется rn

где d1…dn — пороговые значения, а r0…rn — визуальные значения.

Ключевая особенность: количество элементов в range всегда равно domain.length + 1.


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

В Vega-Lite шкала threshold задаётся через объект scale с типом "threshold":

{
  "data": {
    "values": [
      {"value": 10},
      {"value": 35},
      {"value": 60},
      {"value": 85}
    ]
  },
  "mark": "circle",
  "encoding": {
    "x": {"field": "value", "type": "quantitative"},
    "y": {"field": "value", "type": "quantitative"},
    "color": {
      "field": "value",
      "type": "quantitative",
      "scale": {
        "type": "threshold",
        "domain": [20, 50, 80],
        "range": ["#2c7bb6", "#abd9e9", "#fdae61", "#d7191c"]
      }
    }
  }
}

Здесь значения распределяются по четырём цветовым зонам:

  • < 20
  • 20–49
  • 50–79
  • ≥ 80

Отличие от других шкал

Линейная шкала (linear)

Линейная шкала выполняет непрерывное отображение:

  • вход: любое число
  • выход: плавный градиент

threshold не интерполирует, а дискретизирует.


Quantize

quantize автоматически делит диапазон на равные интервалы.

threshold отличается тем, что:

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

Quantile

quantile строит интервалы на основе распределения данных.

threshold полностью игнорирует распределение и опирается только на заданные границы.


Формат domain и range

domain

domain — массив чисел строго по возрастанию:

"domain": [10, 20, 50]

Ошибочные случаи:

  • неотсортированный массив
  • дублирующиеся значения
  • нечисловые элементы

range

range — массив визуальных значений:

"range": ["green", "yellow", "orange", "red"]

Типы значений могут быть:

  • цвета (string)
  • числа (размеры)
  • символы (shape)
  • числовые коэффициенты

Поведение на границах

Границы в threshold шкале являются левозакрытыми интервалами:

  • нижняя граница включается
  • верхняя исключается

Пример:

domain: [10, 20]

intervals:
(-∞, 10)
[10, 20)
[20, +∞)

Практическое применение

Цветовое кодирование рисков

"scale": {
  "type": "threshold",
  "domain": [0.3, 0.6, 0.9],
  "range": ["green", "yellow", "orange", "red"]
}

Используется для:

  • финансовых рисков
  • медицинских показателей
  • оценок качества

Карты (choropleth)

При визуализации геоданных threshold позволяет задавать смысловые зоны:

"color": {
  "field": "density",
  "type": "quantitative",
  "scale": {
    "type": "threshold",
    "domain": [50, 100, 200, 500],
    "range": ["#f7fbff", "#c6dbef", "#6baed6", "#2171b5", "#08306b"]
  }
}

Применение:

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

Финансовые индикаторы

"scale": {
  "type": "threshold",
  "domain": [-10, 0, 10],
  "range": ["#d73027", "#fee08b", "#1a9850", "#006837"]
}

Интерпретация:

  • падение
  • стагнация
  • рост
  • сильный рост

Поведение при выходе за диапазон

Если значение:

  • меньше минимального порога → используется первый элемент range
  • больше последнего порога → используется последний элемент range

Таким образом шкала всегда тотальна и не имеет «пустых зон».


Интеграция с Vega

В спецификации Vega threshold шкала используется аналогично, но на уровне более низкоуровневых конструкций:

{
  "scales": [
    {
      "name": "colorScale",
      "type": "threshold",
      "domain": [10, 50, 100],
      "range": ["blue", "yellow", "red", "black"]
    }
  ]
}

Далее шкала применяется через scale("colorScale").


Типичные ошибки проектирования

Несоответствие длины range

Наиболее частая ошибка:

"domain": [10, 20, 30],
"range": ["red", "green"]

Такое определение некорректно, так как требуется 4 значения в range.


Неправильная интерпретация интервалов

Ошибка логики возникает, когда ожидается включение верхней границы в интервал.


Использование threshold вместо quantile

При неравномерных данных threshold может давать визуально «перекошенную» картину, так как не учитывает распределение.


Комбинация с трансформациями данных

Threshold шкала часто используется вместе с:

  • aggregate (средние значения по группам)
  • bin (предварительное разбиение данных)
  • calculate (вычисляемые поля)

Пример:

"transform": [
  {
    "calculate": "datum.sales / datum.target",
    "as": "ratio"
  }
]

и далее применяется threshold к ratio.


Дизайнерские принципы выбора порогов

Пороговые значения обычно задаются не математически, а семантически:

  • нормативы (например, допустимые пределы)
  • бизнес-метрики
  • экспертные оценки
  • регуляторные границы

Это отличает threshold от статистических шкал.


Производительность и вычисления

Threshold шкала:

  • не требует интерполяции
  • выполняет только сравнения
  • имеет сложность O(n) по количеству порогов

Это делает её эффективной для больших наборов данных в визуализациях.


Взаимодействие с легендой

В Vega-Lite легенда автоматически группирует значения по интервалам threshold шкалы, но:

  • подписи интервалов не всегда очевидны
  • часто требуется ручная настройка legend.labelExpr

Пример:

"legend": {
  "labelExpr": "datum.value < 20 ? '<20' : datum.value < 50 ? '20-49' : datum.value < 80 ? '50-79' : '80+'"
}

Использование в многошкальных визуализациях

Threshold может комбинироваться с другими шкалами:

  • position (linear)
  • size (linear/log)
  • color (threshold)

Так формируются многомерные карты, где цвет отражает категории, а координаты — числовые значения.


Сравнение с непрерывными шкалами в таблице логики

Тип шкалы Тип отображения Основа деления
linear непрерывная функция
quantize дискретная равные интервалы
quantile дискретная распределение
threshold дискретная заданные пороги

Особенности интерпретации в интерфейсах

При использовании threshold шкалы визуальная интерпретация становится категорической:

  • цвет = класс
  • а не значение

Это усиливает:

  • читаемость
  • скорость восприятия
  • возможность сравнения групп

но снижает точность восприятия конкретных чисел