Компонент TreeMap: конфигурация и тайлинг

Структура данных и базовые требования компонента

Компонент TreeMap в библиотеке Nivo строится вокруг иерархической структуры данных, где каждый узел может содержать вложенные элементы и числовые значения, определяющие площадь отображаемых прямоугольников.

Минимально корректная структура данных выглядит как дерево:

  • каждый узел имеет уникальный идентификатор (id)
  • внутренние узлы содержат массив children
  • листовые узлы содержат числовое поле value

Ключевым моментом является то, что визуализация рассчитывает площадь прямоугольников исключительно на основе value, а структура вложенности определяет иерархию группировки.

Особое значение имеет параметр identity, который задаёт поле уникальной идентификации узла. В типичной конфигурации:

  • identity: "id" — используется поле id
  • альтернативно может применяться доступ к вложенным ключам через функции

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


Основные параметры конфигурации TreeMap

Компонент <TreeMap /> из пакета @nivo/treemap поддерживает широкий набор настроек, влияющих как на визуальное представление, так и на алгоритм раскладки.

Ключевые свойства

  • data — иерархический объект
  • identity — ключ уникальности узлов
  • value — поле, используемое для расчёта площади
  • valueFormat — форматирование чисел (например, d3-format строка)
  • margin — внешние отступы графика
  • outerPadding — расстояние между корневыми элементами
  • innerPadding — расстояние между вложенными блоками

Управление отображением текста

  • label — функция формирования подписи
  • labelSkipSize — минимальный размер элемента, при котором отображается текст
  • labelTextColor — цвет текста
  • orientLabel — поворот текста внутри блока

Лейблы в TreeMap напрямую зависят от доступной площади. При малых размерах узла подпись автоматически скрывается, если задан порог через labelSkipSize.


Цветовая модель и визуальная кодировка

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

Основные параметры:

  • colors — палитра или функция генерации цвета

  • colorBy — стратегия распределения цвета:

    • "id" — по идентификатору
    • "depth" — по уровню вложенности
    • "parentColor" — наследование цвета от родителя

Также возможно использование кастомных функций:

(node) => node.data.value > 100 ? '#ff4d4d' : '#4d79ff'

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


Алгоритмы тайлинга (Tile strategies)

Сердце TreeMap — алгоритм раскладки прямоугольников. В Nivo используется система тайлинга из d3-hierarchy, которая определяет, как именно пространство делится между узлами.

Параметр:

  • tile

определяет стратегию разбиения.

Squarify (основной алгоритм)

Squarify стремится минимизировать отклонение от квадратной формы блоков.

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

Поведение:

  • значения сортируются по убыванию
  • каждый слой формируется так, чтобы поддерживать «квадратность» областей

Это стандартный режим, используемый по умолчанию.


Binary tiling

Алгоритм binary рекурсивно делит пространство пополам.

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

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

Подходит для случаев, где важна структурная согласованность, а не визуальная эстетика.


Slice

Slice реализует горизонтальное разбиение:

  • элементы размещаются слоями сверху вниз
  • ширина сохраняется постоянной на уровне слоя
  • высота распределяется пропорционально значениям

Характеристики:

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

Dice

Dice — вертикальный аналог slice:

  • разбиение происходит по вертикали
  • ширина варьируется, высота фиксируется на уровне слоя

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

  • сравнений категорий с фиксированной структурой
  • отображения распределений по вертикали

SliceDice

Комбинированный алгоритм:

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

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

  • улучшает визуальную вариативность
  • уменьшает эффект «полосатости»
  • подходит для глубоких иерархий

Влияние глубины и иерархии на тайлинг

TreeMap обрабатывает каждый уровень дерева независимо, но в рамках выбранного алгоритма.

Глубина влияет на:

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

На верхних уровнях:

  • блоки крупнее
  • чаще отображаются подписи

На нижних уровнях:

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

Отступы и пространственная организация

Параметры:

  • innerPadding
  • outerPadding

определяют визуальное разделение элементов.

Inner padding

Разделяет дочерние элементы внутри одного родителя.

Эффекты:

  • снижает визуальную плотность
  • улучшает различимость границ
  • уменьшает «слипание» прямоугольников

Outer padding

Отделяет разные ветви дерева.

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

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

Управление границами и визуальными эффектами

TreeMap поддерживает настройку визуального оформления границ:

  • borderColor — цвет рамки
  • borderWidth — толщина линий
  • borderOpacity — прозрачность границ

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


Анимации и переходы состояния

Nivo использует react-spring для анимации переходов.

Ключевые параметры:

  • animate — включение анимации
  • motionConfig — пресет скорости и плавности

Типичные конфигурации:

  • gentle — мягкие переходы
  • wobbly — более выраженные колебания
  • stiff — быстрые и резкие переходы

Анимация применяется к:

  • изменению размеров блоков
  • перестройке дерева
  • смене данных

Работа с подписями узлов

Label rendering зависит от геометрии узла.

Основные стратегии:

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

Дополнительные параметры:

  • labelSkipSize — минимальный размер блока
  • labelRotation — угол поворота
  • labelPadding — внутренний отступ текста

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


Пользовательские функции и расширяемость

TreeMap допускает передачу функций для кастомизации поведения:

  • label — кастомный рендер текста
  • valueFormat — форматирование чисел
  • tooltip — кастомные всплывающие подсказки
  • colors — динамическое вычисление цвета

Функциональный подход позволяет интегрировать:

  • бизнес-логику агрегации
  • контекстные метрики
  • внешние источники данных

Особенности производительности

TreeMap оптимизирован для работы с большими деревьями, однако производительность зависит от:

  • глубины иерархии
  • количества узлов
  • сложности кастомных функций

Основные факторы нагрузки:

  • пересчёт layout при изменении данных
  • генерация DOM-элементов
  • вычисление цветов и подписей

Оптимизационные подходы:

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

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

При обновлении data происходит полная перерасчётная стадия:

  • пересчитываются значения узлов
  • заново применяется алгоритм tile
  • обновляется геометрия всех прямоугольников

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


Взаимодействие с событиями

TreeMap поддерживает события:

  • onClick — клик по узлу
  • onMouseEnter — наведение
  • onMouseLeave — уход курсора

Каждое событие передаёт объект узла с полной метаинформацией:

  • id
  • value
  • depth
  • parent

Эта информация используется для построения интерактивных интерфейсов, фильтрации и drill-down навигации по данным.