Хороплетные карты: связывание данных с геометрией

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


Геометрическая основа: GeoJSON и TopoJSON

Географическая часть хороплета обычно задаётся в формате GeoJSON или TopoJSON. Эти форматы описывают:

  • контуры стран, регионов, районов;
  • набор координатных полигонов;
  • идентификаторы объектов (id, name, code);
  • топологические связи (в случае TopoJSON).

GeoJSON представляет каждый объект независимо, тогда как TopoJSON хранит общие границы один раз, уменьшая размер данных и устраняя дублирование.

В Vega/Vega-Lite геоданные обычно подключаются как отдельный источник данных:

{
  "data": {
    "url": "countries.topojson",
    "format": {
      "type": "topojson",
      "feature": "countries"
    }
  }
}

Ключевой момент заключается в том, что геометрия сама по себе не содержит смысловой нагрузки (например, ВВП, плотности населения, уровня доходов). Она лишь определяет форму.


Атрибутивные данные: статистическая плоскость

Вторая часть хороплета — таблица значений:

country_id value
KZ 87
RU 65
CN 120

Эта таблица является независимой от геометрии и содержит только числовую или категориальную информацию. Именно она определяет цветовую окраску регионов.


Связывание данных: ключевая операция lookup join

В Vega-Lite основной механизм объединения геометрии и атрибутов — lookup transform. Он позволяет связать два источника данных по ключу.

{
  "transform": [
    {
      "lookup": "id",
      "from": {
        "data": {
          "url": "data.csv"
        },
        "key": "country_id",
        "fields": ["value"]
      }
    }
  ]
}

Здесь:

  • id — поле в геоданных (например, код страны);
  • country_id — поле в таблице значений;
  • value — извлекаемое числовое значение.

Результатом становится расширенный геометрический объект, содержащий как координаты, так и статистику.


Проекции: преобразование сферы в плоскость

Географические координаты (долгота и широта) необходимо преобразовать в координаты экрана. Это делает географическая проекция.

"projection": {
  "type": "mercator"
}

Наиболее распространённые типы:

  • mercator — стандартная веб-карта;
  • equalEarth — более сбалансированное искажение площадей;
  • albersUsa — специализированная проекция США;
  • naturalEarth1 — компромисс между формой и площадью.

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


Цветовые шкалы и кодирование значений

После объединения данных и геометрии применяется цветовое кодирование. В Vega-Lite это реализуется через scale в encoding.

"encoding": {
  "color": {
    "field": "value",
    "type": "quantitative",
    "scale": {
      "scheme": "blues"
    }
  }
}

Основные типы шкал:

  • linear — линейное распределение;
  • log — логарифмическая шкала для больших диапазонов;
  • quantize — деление на фиксированные интервалы;
  • quantile — равные группы по количеству объектов;
  • sqrt — сглаживание больших выбросов.

Выбор шкалы определяет интерпретацию данных. Например, логарифмическая шкала используется при сильной асимметрии распределения.


Базовая структура хороплетной карты в Vega-Lite

Минимальный пример включает три компонента: геоданные, трансформацию и визуальное кодирование.

{
  "$schema": "https://vega.github.io/schema/vega-lite/v5.json",
  "width": 800,
  "height": 400,
  "data": {
    "url": "world.topojson",
    "format": {
      "type": "topojson",
      "feature": "countries"
    }
  },
  "transform": [
    {
      "lookup": "id",
      "from": {
        "data": {
          "url": "values.csv"
        },
        "key": "country_id",
        "fields": ["value"]
      }
    }
  ],
  "projection": {
    "type": "equalEarth"
  },
  "mark": "geoshape",
  "encoding": {
    "color": {
      "field": "value",
      "type": "quantitative",
      "scale": {
        "scheme": "viridis"
      }
    }
  }
}

В этом описании отсутствует императивная логика: вся карта описывается декларативно как набор правил преобразования данных.


Роль geoshape и геометрических примитивов

Маркер geoshape является специализированным типом визуального элемента. Он интерпретирует входные данные как геометрические объекты, а не как точки или линии.

В Vega существует более низкоуровневый контроль, где геометрия может быть выражена через:

  • shape
  • path
  • graticule
  • sphere

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


Масштабирование данных и нормализация

Хороплеты часто требуют предварительной обработки данных:

  • нормализация на душу населения;
  • логарифмирование экономических показателей;
  • устранение выбросов;
  • приведение к диапазону 0–1.

Пример нормализации через transform:

{
  "transform": [
    {
      "calculate": "datum.value / datum.population",
      "as": "per_capita"
    }
  ]
}

После этого визуализация работает уже не с абсолютными значениями, а с относительными показателями, что значительно повышает корректность сравнения регионов.


Проблема классификации значений

Хороплетные карты требуют дискретизации непрерывных данных. Основные стратегии:

  1. Равные интервалы (quantize) Делят диапазон на фиксированное количество классов.

  2. Квантили (quantile) Каждый класс содержит одинаковое количество объектов.

  3. Пользовательские пороги Заданные вручную границы.

В Vega-Lite это задаётся через scale:

"scale": {
  "type": "quantile",
  "scheme": "magma"
}

Выбор метода влияет на визуальное восприятие распределения данных и может либо скрывать, либо подчёркивать неравномерность.


Многослойные карты и композиция

Хороплет редко существует в изоляции. Часто поверх него добавляются:

  • границы стран;
  • точки городов;
  • подписи;
  • дополнительные тепловые слои.

В Vega это реализуется через layer:

{
  "layer": [
    {
      "mark": "geoshape",
      "encoding": {
        "color": {"field": "value", "type": "quantitative"}
      }
    },
    {
      "mark": {
        "type": "geoshape",
        "stroke": "black",
        "fill": null
      }
    }
  ]
}

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


Привязка к идентификаторам и устойчивость соединения

Ключевой технический аспект хороплета — стабильность ключа соединения. Используются:

  • ISO-коды стран (ISO 3166-1 alpha-2 / alpha-3);
  • внутренние идентификаторы наборов данных;
  • административные коды.

Несовпадение ключей приводит к «потере» регионов, которые остаются неокрашенными.


Масштабируемость и производительность

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

  • количество вершин полигонов;
  • размер TopoJSON;
  • частота перерисовки;
  • сложность трансформаций.

TopoJSON часто используется как оптимизация, поскольку уменьшает объем данных и ускоряет декодирование.


Интерпретация визуального результата

Хороплетная карта кодирует данные через:

  • цвет (основной канал);
  • иногда через прозрачность;
  • редко через текстурирование или контуры.

Однако цвет остаётся доминирующим каналом, что накладывает ограничения:

  • невозможность точного сравнения близких значений;
  • зависимость от восприятия палитры;
  • влияние контекста соседних регионов.

Геометрия как функция данных

В декларативной модели Vega геометрия не является статичной. Она определяется функцией от данных:

geometry = f(geographic coordinates)
color = g(data value)
projection = h(lat, lon)

Связка этих функций формирует итоговую визуальную структуру, где карта становится результатом последовательных преобразований, а не ручного рисования объектов.