В системе визуализации Nivo легенды представляют собой отдельный слой
интерфейса, который связывает визуальные элементы графика с их
семантическим значением. Конфигурация легенд строится декларативно через
массив объектов legends, где каждый объект описывает
отдельный блок легенды с собственными правилами размещения, отображения
символов и форматирования текста.
Ключевая особенность архитектуры легенд в Nivo заключается в том, что они не привязаны жёстко к типу графика. Один и тот же механизм используется для линейных графиков, столбчатых диаграмм, круговых и тепловых карт, что делает систему универсальной, но требует точного управления параметрами позиционирования.
Базовый механизм размещения определяется свойством
anchor, задающим точку привязки относительно области
графика:
toptop-rightrightbottom-rightbottombottom-leftlefttop-leftКаждое значение фиксирует легенду в одной из сторон контейнера. Однако фактическое положение почти всегда уточняется дополнительными параметрами смещения:
translateXtranslateYЭти значения позволяют сдвигать легенду относительно выбранного anchor, формируя точное расположение в сложных интерфейсных компоновках.
Пример базовой конфигурации:
legends: [
{
anchor: 'bottom-right',
direction: 'column',
translateX: 20,
translateY: -10,
itemWidth: 100,
itemHeight: 18
}
]
Механизм позиционирования в Nivo работает в координатах SVG-контейнера, что делает поведение предсказуемым при масштабировании графика, но требует учета размеров самого контейнера при сложных макетах.
Свойство direction управляет логикой расположения
элементов внутри легенды:
column — вертикальная компоновкаrow — горизонтальная компоновкаВыбор направления влияет не только на визуальный поток, но и на
расчет отступов между элементами. При column каждый элемент
получает вертикальное смещение через itemsSpacing, при
row — горизонтальное.
Дополнительные параметры:
itemsSpacing — расстояние между элементамиitemDirection — направление внутренней структуры
элемента (left-to-right, right-to-left)legends: [
{
anchor: 'right',
direction: 'column',
itemDirection: 'left-to-right',
itemsSpacing: 12
}
]
Компоновка легенды определяется фиксированными размерами:
itemWidth — ширина элементаitemHeight — высота элементаЭти параметры задают жесткую сетку, внутри которой размещаются символ и текст. В отличие от гибких layout-систем, Nivo использует предсказуемую модель, где каждый элемент занимает одинаковое пространство.
Это особенно важно при работе с большим количеством категорий: при
недостаточной ширине контейнера легенда начинает визуально уплотняться,
что может требовать перерасчета itemWidth или переноса
легенды в другую позицию.
Символ (symbol) является ключевым визуальным маркером,
связывающим легенду с данными графика. Управление символами
осуществляется через несколько параметров:
symbolSize — размер маркераsymbolShape — форма маркераПоддерживаемые формы зависят от типа графика, но наиболее распространены:
circlesquaretrianglediamondlinelegends: [
{
anchor: 'bottom',
symbolSize: 12,
symbolShape: 'circle'
}
]
Символы в Nivo не являются декоративными элементами — они отражают
тип визуализации данных. Например, в линейных графиках часто
используется line, а в категориальных диаграммах —
circle или square.
Текстовая часть легенды формируется на основе данных графика, но
может быть модифицирована через форматтеры. Основной механизм — свойство
format или formatter (в зависимости от
компонента).
Форматирование позволяет:
Пример:
legends: [
{
anchor: 'bottom',
formatter: (value) => `${value} %`
}
]
В более сложных сценариях используется функция, получающая доступ к полному объекту данных элемента, что позволяет строить условное форматирование:
legends: [
{
anchor: 'right',
format: (value, entry) =>
entry.hidden ? `${value} (скрыто)` : value
}
]
Каждый элемент легенды может иметь поведенческие эффекты,
определяемые через effects. Они управляют состояниями hover
и active:
legends: [
{
anchor: 'bottom',
effects: [
{
on: 'hover',
style: {
itemOpacity: 1
}
},
{
on: 'mouseout',
style: {
itemOpacity: 0.7
}
}
]
}
]
Эта модель построена на декларативном описании состояний, что исключает необходимость ручного управления DOM-манипуляциями.
При использовании нескольких легенд одновременно каждая из них описывается отдельным объектом в массиве. Это позволяет создавать независимые блоки для разных наборов данных.
legends: [
{
anchor: 'bottom',
dataFrom: 'keys',
direction: 'row'
},
{
anchor: 'right',
dataFrom: 'indexes',
direction: 'column'
}
]
Каждая легенда может ссылаться на разные источники данных:
keys — ключи серийindexes — индексы слоевdatum — произвольные поля данныхТакой подход используется при построении составных графиков, где визуальные слои должны иметь независимую семантическую интерпретацию.
В SVG-рендеринге Nivo легенды не участвуют в потоковой верстке. Это означает, что они не влияют на размер графика и не перераспределяют пространство. Вся логика позиционирования основана на фиксированных координатах относительно контейнера.
При изменении размеров контейнера:
Это делает легенды стабильными в responsive-сценариях, но требует ручной настройки при сложных адаптивных интерфейсах.
Стилизация текста и символов может наследоваться из глобальной темы:
fontSizefontFamilytextColorПример интеграции с темой:
theme: {
legends: {
text: {
fontSize: 12,
fill: '#333'
}
}
}
Тематическая система позволяет унифицировать внешний вид легенд во всех графиках приложения, исключая дублирование конфигураций.
При недостатке места легенда не выполняет автоматического переноса. Вместо этого поведение определяется:
itemWidthdirectionanchorВертикальные легенды (column) обычно устойчивее к
ограниченному пространству, тогда как горизонтальные (row)
требуют более широкой области отображения.
Каждый элемент легенды связан с идентификатором данных графика. В зависимости от типа графика это могут быть:
Эта связь определяет не только текст, но и интерактивное поведение: скрытие серии, подсветка или фильтрация данных часто реализуются через взаимодействие с легендой.