В круговых и кольцевых диаграммах основная проблема визуализации подписей заключается в ограниченном пространстве вокруг сегментов. При большом количестве долей подписи неизбежно выносятся за пределы графика, что требует визуального соединения текста с соответствующим сектором. В библиотеке Nivo этот механизм реализован через систему arc link labels — линий, связывающих сегменты диаграммы с внешними подписями.
Функция соединительных линий состоит в сохранении читаемости распределения данных при высокой плотности элементов, обеспечивая однозначную ассоциацию между сектором и его меткой без перегрузки центральной области графика.
Внутренняя модель формирования линий основана на геометрическом анализе дуги окружности. Для каждого сегмента вычисляются:
Линия метки состоит из трёх логических сегментов:
Такое разбиение обеспечивает читаемость даже при плотном расположении подписей.
В компоненте ResponsivePie механизм включается через
набор свойств arcLinkLabels*.
import { ResponsivePie } from '@nivo/pie'
const data = [
{ id: 'A', value: 32 },
{ id: 'B', value: 21 },
{ id: 'C', value: 17 }
]
const Chart = () => (
<ResponsivePie
data={data}
margin={{ top: 40, right: 120, bottom: 40, left: 120 }}
arcLinkLabelsSkipAngle={10}
arcLinkLabelsTextColor="#333333"
arcLinkLabelsThickness={2}
arcLinkLabelsColor={{ from: 'color' }}
/>
)
Ключевым параметром выступает arcLinkLabelsSkipAngle,
определяющий минимальный угол сектора, при котором отображается линия.
Малые сегменты часто скрываются для предотвращения визуального шума.
Форма линии определяется комбинацией нескольких параметров:
Комбинация этих значений формирует характерный «ломаный» маршрут, позволяющий избежать пересечения линий между собой.
При увеличении arcLinkLabelsDiagonalLength линии
становятся более выраженными и выносят подписи дальше от диаграммы,
снижая плотность в периферийной зоне.
Соединительные линии не являются самостоятельным графическим элементом, а подчиняются цветовой логике сектора. Наиболее часто применяется стратегия наследования цвета:
arcLinkLabelsColor: { from: 'color' } — линия повторяет
цвет сектора;Контраст между линией и фоном критичен при высокой плотности данных, особенно в тёмных темах интерфейса.
В Nivo предусмотрена возможность переопределения отрисовки
соединительных линий через arcLinkLabelComponent.
arcLinkLabelComponent={({ label, style }) => (
<g transform={style.transform}>
<path d={style.path} stroke={style.color} strokeWidth={2} fill="none" />
<text
x={style.textPosition.x}
y={style.textPosition.y}
alignmentBaseline="middle"
fill={style.textColor}
fontSize={12}
>
{label}
</text>
</g>
)}
Такой подход позволяет полностью контролировать геометрию и стиль линии, включая добавление дополнительных узлов, маркеров или анимации.
При уменьшении доли сегмента возрастает риск наложения подписей. Встроенный механизм Nivo применяет стратегию подавления:
Параметр arcLinkLabelsSkipAngle является основным
регулятором плотности подписей и напрямую влияет на количество
отображаемых линий.
Текстовые элементы, соединённые линиями, выравниваются относительно конечной точки линии. Используются следующие принципы:
textAnchor и
dominantBaseline.При этом Nivo автоматически вычисляет сторону размещения подписи, чтобы минимизировать пересечения линий.
Основные параметры визуального оформления:
arcLinkLabelsThickness);arcLinkLabelsColor);strokeOpacity;При увеличении толщины линий визуальная структура становится более доминирующей, что может использоваться для выделения ключевых сегментов.
Диаграммы Nivo пересчитывают координаты линий при изменении размеров контейнера. Перестройка включает:
Это обеспечивает стабильное положение подписей при изменении размеров без нарушения связей между элементами.
При высокой плотности данных возможны пересечения соединительных линий. В стандартной реализации применяются следующие эвристики:
Полного алгоритма коллизий нет, поэтому поведение зависит от конфигурации и структуры входных данных.
При работе с большим количеством категорий структура соединительных линий становится вторичным визуальным слоем. Основная цель смещается в сторону:
Использование arcLinkLabelsSkipAngle совместно с
увеличением внешнего радиуса диаграммы позволяет значительно снизить
плотность линий и повысить читаемость.