В Nivo вся система визуализации строится вокруг строгой координатной модели SVG/Canvas, где каждый график имеет внутреннюю область отрисовки (inner area) и внешние отступы (margin). Позиционирование элементов определяется не абсолютными координатами страницы, а пересчётом данных в координаты графика через шкалы (scales).
Ключевая идея заключается в разделении пространства:
Любое смещение элементов происходит относительно внутреннего прямоугольника, вычисляемого после применения margins.
Margin задаёт внешний отступ графика и определяет, где начинается координатная сетка.
<ResponsiveLine
data={data}
margin={{ top: 50, right: 120, bottom: 60, left: 80 }}
/>
После применения margin:
Внутренние координаты пересчитываются как:
innerWidth = width - left - right
innerHeight = height - top - bottom
Любое визуальное смещение далее опирается именно на innerWidth и innerHeight.
Оси в Nivo (xAxis, yAxis) не являются фиксированными элементами DOM. Их положение вычисляется через конфигурацию scale и ориентацию.
<ResponsiveBar
data={data}
margin={{ top: 40, right: 40, bottom: 50, left: 60 }}
axisBottom={{
tickSize: 5,
tickPadding: 8,
tickRotation: 0
}}
axisLeft={{
tickSize: 5,
tickPadding: 8,
tickRotation: 0
}}
/>
Параметры влияния на смещение:
tickPadding — расстояние от оси до подписиtickSize — длина деленийtickRotation — изменение геометрии подписи, влияющее на
bounding boxlegendOffset — дополнительное смещение легенды осиОсь фактически «прижимается» к границе inner area, а подписи выходят за её пределы в сторону margin-зоны.
Легенды в Nivo размещаются поверх графика, но их позиционирование рассчитывается относительно внутренней области.
legends={[
{
anchor: 'right',
direction: 'column',
translateX: 100,
itemWidth: 80,
itemHeight: 20,
symbolSize: 12
}
]}
Основные параметры смещения:
anchor — базовая точка привязки (left, right, top,
bottom)translateX / translateY — ручное смещение относительно
anchordirection — влияет на направление потока элементовitemSpacing — расстояние между элементами спискаЛегенда не участвует в layout flow, поэтому любые смещения должны компенсировать её потенциальное перекрытие с chart area вручную через margin.
Tooltip в Nivo позиционируется динамически на основе координат курсора. Основной принцип — следование за pointer с ограничением выхода за границы контейнера.
tooltip={({ point }) => (
<div
style={{
transform: `translate(${point.x}px, ${point.y}px)`
}}
>
{point.data.yFormatted}
</div>
)}
Механика смещения:
Для кастомного контроля часто вводятся дополнительные сдвиги:
Сетка строится на основе делений осей и inherits их смещения. Grid lines всегда выровнены с tick positions.
<ResponsiveLine
enableGridX={true}
enableGridY={true}
/>
Смещение сетки происходит косвенно:
Grid не имеет собственного offset — он полностью зависит от осей.
В Nivo bar charts используют дополнительный слой смещения внутри категориальной шкалы.
<ResponsiveBar
data={data}
groupMode="grouped"
padding={0.2}
innerPadding={3}
/>
Факторы смещения:
padding — расстояние между группами баровinnerPadding — расстояние между элементами внутри
группыindexScale — определяет положение категории по осиvalueScale — масштабирует высоту/ширинуФактически каждый бар вычисляется как:
x = scale(index) + offsetGroup + offsetBar
Любое изменение padding приводит к перераспределению всей структуры координат внутри inner area.
В радиальных диаграммах смещение выражается через центр (centerX, centerY) и радиус.
<ResponsivePie
innerRadius={0.5}
padAngle={0.7}
/>
Особенности позиционирования:
Смещение здесь не линейное, а угловое:
angle = startAngle + arcLength + padAngle
Система layers управляет порядком отрисовки, влияя на восприятие смещения элементов по глубине.
layers={[
'grid',
'axes',
'bars',
'markers',
'legends'
]}
Изменение порядка слоёв:
Custom layer позволяет вводить дополнительные offset-эффекты, например тени или аннотации.
Аннотации используют координаты данных, но отрисовываются с дополнительными transform-сдвигами.
annotations={[
{
type: 'circle',
match: { index: 2 },
noteX: 20,
noteY: -30
}
]}
Параметры смещения:
Аннотации всегда рассчитываются после scale трансформации данных.
Внутренняя модель позиционирования включает последовательные этапы:
Любое визуальное смещение является результатом комбинации этих слоёв, а не отдельной координатной правки.