Поле sort: сортировка осей и легенд

В спецификациях Vega-Lite сортировка задаётся через свойство sort внутри encoding и управляет порядком категориальных осей, а также последовательностью элементов в легендах. В Vega поведение сортировки реализуется на более низком уровне через трансформации и сигналы, однако в большинстве прикладных задач используется именно механизм Vega-Lite.


Базовая модель сортировки в encoding.sort

Свойство sort применяется к каналам x, y, color, row, column при категориальных данных. Оно определяет порядок отображения шкалы или дискретных значений.

Основные формы:

Сортировка по возрастанию / убыванию

{
  "encoding": {
    "x": {
      "field": "category",
      "type": "nominal",
      "sort": "ascending"
    },
    "y": {
      "field": "value",
      "type": "quantitative"
    }
  }
}

Допустимые значения:

  • "ascending" — по возрастанию
  • "descending" — по убыванию

Для числовых данных это означает прямую сортировку значений поля. Для строк — лексикографический порядок.


Сортировка по другому полю

Часто требуется сортировать категории по значению агрегированного показателя.

{
  "encoding": {
    "x": {
      "field": "category",
      "type": "nominal",
      "sort": {
        "field": "value",
        "op": "mean",
        "order": "descending"
      }
    },
    "y": {
      "aggregate": "mean",
      "field": "value"
    }
  }
}

Ключевые компоненты объекта сортировки:

  • field — поле, по которому выполняется сортировка
  • op — агрегирующая операция (sum, mean, median, max, min, count)
  • order — направление (ascending, descending)

Такой подход позволяет строить диаграммы, где категории упорядочены по статистике, а не по исходным данным.


Явно заданный порядок категорий (custom sort array)

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

{
  "encoding": {
    "x": {
      "field": "month",
      "type": "nominal",
      "sort": [
        "Jan", "Feb", "Mar", "Apr", "May", "Jun"
      ]
    },
    "y": {
      "field": "sales",
      "type": "quantitative"
    }
  }
}

Особенности:

  • порядок строго фиксирован
  • отсутствующие значения располагаются в конце
  • игнорируется естественная сортировка

Такой метод критически важен для календарных шкал, стадий процессов и пользовательских таксономий.


Сортировка осей (axis domain order)

Сортировка влияет не только на порядок отображения меток, но и на домен шкалы. Vega-Lite автоматически формирует domain на основе данных, но sort может переопределить порядок категорий.

Пример:

{
  "encoding": {
    "y": {
      "field": "product",
      "type": "nominal",
      "sort": "descending"
    },
    "x": {
      "field": "revenue",
      "type": "quantitative"
    }
  }
}

Здесь ось Y будет упорядочена по убыванию значений категории, что влияет на визуальную иерархию графика.


Сортировка в легендах

Легенды для color, shape, size также поддерживают sort.

{
  "encoding": {
    "color": {
      "field": "group",
      "type": "nominal",
      "sort": "ascending"
    },
    "x": {
      "field": "value",
      "type": "quantitative"
    }
  }
}

Влияние:

  • порядок элементов в легенде
  • порядок отображения слоёв при наложении (в некоторых графиках)
  • согласованность с восприятием категорий

Сортировка по времени и временным шкалам

Для temporal типов данных sort чаще всего не требуется, но может быть использован при дискретизации времени:

{
  "encoding": {
    "x": {
      "field": "date",
      "type": "temporal",
      "timeUnit": "month",
      "sort": "ascending"
    },
    "y": {
      "field": "value",
      "type": "quantitative"
    }
  }
}

Если временные значения агрегируются (например, по месяцам), сортировка гарантирует правильный календарный порядок.


Взаимодействие sort и агрегатов

При использовании агрегирования поведение сортировки зависит от уровня вычислений.

{
  "encoding": {
    "x": {
      "field": "region",
      "type": "nominal",
      "sort": {
        "op": "sum",
        "field": "profit",
        "order": "descending"
      }
    },
    "y": {
      "aggregate": "sum",
      "field": "profit"
    }
  }
}

Механика:

  1. выполняется агрегация данных
  2. вычисляются итоговые значения по категориям
  3. категории сортируются по результату
  4. формируется шкала

Сортировка и масштаб (scale.sort)

В некоторых случаях сортировка задаётся на уровне шкалы:

{
  "encoding": {
    "x": {
      "field": "category",
      "type": "nominal",
      "scale": {
        "domain": {
          "sort": {
            "field": "value",
            "op": "sum",
            "order": "ascending"
          }
        }
      }
    }
  }
}

Такой подход используется:

  • при сложных комбинированных визуализациях
  • при явном контроле domain шкалы
  • при вложенных трансформациях

Поведение сортировки при null и missing values

Категории с отсутствующими значениями:

  • обычно перемещаются в конец шкалы
  • могут игнорироваться при агрегации
  • в custom array сортировке остаются в конце, если не указаны явно

Пример:

"sort": ["A", "B", "C"]

Если встречается "D", он будет добавлен после всех перечисленных.


Сортировка в многослойных и faceted-графиках

В facet, row, column сортировка влияет на порядок панелей:

{
  "facet": {
    "field": "region",
    "type": "nominal",
    "sort": "descending"
  },
  "spec": {
    "mark": "bar",
    "encoding": {
      "x": { "field": "product", "type": "nominal" },
      "y": { "field": "sales", "type": "quantitative" }
    }
  }
}

Последовательность панелей определяется сортировкой facet-поля, что критично для сравнительных визуализаций.


Конфликты и приоритеты сортировки

При одновременном указании нескольких уровней сортировки действует следующая иерархия:

  1. Явный массив значений (["A", "B", "C"])
  2. Объект с field + op + order
  3. "ascending" / "descending"
  4. Сортировка по умолчанию (исходный порядок данных)

При конфликте Vega-Lite выбирает наиболее конкретное правило.


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

Сортировка по значению метрики

"sort": { "field": "value", "op": "sum", "order": "descending" }

Используется в bar chart для ранжирования категорий.


Фиксированный порядок бизнес-логики

"sort": ["Low", "Medium", "High"]

Используется в шкалах приоритетов и статусах.


Альфавитная сортировка

"sort": "ascending"

Используется для справочников и списков без метрики.


Особенности поведения в Vega

В Vega сортировка не является свойством encoding. Вместо этого применяется:

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

Пример:

{
  "type": "sort",
  "field": "value",
  "order": "descending"
}

или через transform:

{
  "type": "window",
  "sort": { "field": "value", "order": "descending" }
}

Итоговая модель поведения sort

Механизм sort в Vega-Lite объединяет три уровня управления:

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

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