Оси X и Y в визуализациях Nivo определяют структуру координатной системы, в которой отображаются данные. В зависимости от типа графика (линейный, столбчатый, area, scatter и др.) оси могут быть дискретными, линейными, временными или категориальными. Корректная настройка шкал и форматирование меток напрямую влияет на читаемость и интерпретируемость графика, особенно при работе с большими наборами данных или нестандартными форматами значений.
В основе осей лежит концепция шкал, которые преобразуют исходные данные в координаты пикселей.
Используется для числовых значений с равномерным распределением.
scale: {
type: 'linear',
min: 0,
max: 'auto'
}
Линейная шкала применяется по умолчанию в большинстве графиков, где значения имеют количественную природу: доходы, температура, количество пользователей.
Особенности:
max: 'auto'Применяется для данных с экспоненциальным ростом.
scale: {
type: 'log',
base: 10
}
Логарифмическая шкала полезна при визуализации:
Особенность: нулевые и отрицательные значения не поддерживаются.
Используется для оси X при работе с датами.
xScale: {
type: 'time',
format: '%Y-%m-%d',
precision: 'day'
}
Ключевые параметры:
format — формат входной даты (d3-time-format
синтаксис)precision — шаг агрегации (day, month, hour и
т.д.)Типичный пример данных:
data: [
{ x: '2026-01-01', y: 12 },
{ x: '2026-01-02', y: 18 }
]
Используется для дискретных значений.
xScale: {
type: 'point'
}
или
xScale: {
type: 'band',
padding: 0.2
}
Различия:
point — фиксированные точки без ширины (часто line
chart)band — с шириной (bar chart)Ось X задаётся через свойство axisBottom (или
axisTop в зависимости от расположения).
axisBottom={{
legend: 'Дата',
legendPosition: 'middle',
legendOffset: 40
}}
Определяет длину засечек.
tickSize={5}
Отступ текста метки от оси.
tickPadding={8}
Поворот меток.
tickRotation={-45}
Поворот особенно полезен при длинных категориях или датах.
Форматирование значений оси.
axisBottom={{
format: v => `${v} ₽`
}}
или с использованием d3-format:
axisBottom={{
format: '.2s'
}}
Ось Y задаётся через axisLeft или
axisRight.
axisLeft={{
legend: 'Продажи',
legendPosition: 'middle',
legendOffset: -50
}}
Ось Y чаще всего:
Хотя Nivo обычно управляет диапазоном автоматически, можно задать вручную:
yScale={{
type: 'linear',
min: 0,
max: 1000
}}
Форматирование меток — ключевой аспект читаемости графиков.
Используется d3-format.
axisLeft={{
format: value => value.toFixed(2)
}}
или компактная запись:
axisLeft={{
format: '.1f'
}}
Примеры:
.0f — целые числа.2f — два знака после запятой.2s — сокращённый формат (1k, 1M)axisLeft={{
format: value => `$${value}`
}}
или через Intl API:
axisLeft={{
format: value =>
new Intl.NumberFormat('en-US', {
style: 'currency',
currency: 'USD'
}).format(value)
}}
Для временных шкал:
axisBottom={{
format: '%d.%m.%Y'
}}
или через кастомную функцию:
import { format } from 'date-fns'
axisBottom={{
format: v => format(new Date(v), 'dd.MM')
}}
Некорректное соответствие типа шкалы и данных приводит к искажениям графика.
Типичные ошибки:
linear для строковых значенийtimeПример корректной структуры:
const data = [
{ x: new Date('2026-01-01'), y: 10 },
{ x: new Date('2026-01-02'), y: 15 }
]
При большом количестве данных Nivo автоматически скрывает часть ticks, но поведение можно контролировать.
axisBottom={{
tickValues: 5
}}
или явно:
axisBottom={{
tickValues: [
'2026-01-01',
'2026-01-10',
'2026-01-20'
]
}}
Для полного контроля используется renderTick.
axisBottom={{
renderTick: tick => {
return (
<g transform={`translate(${tick.x},${tick.y})`}>
<text
textAnchor="middle"
dy="0.71em"
>
{tick.value}
</text>
</g>
)
}
}}
Это позволяет:
При длинных значениях применяются стратегии:
axisBottom={{
format: v =>
v.length > 10 ? v.slice(0, 10) + '…' : v
}}
axisBottom={{
renderTick: tick => {
const parts = tick.value.split(' ')
return (
<g transform={`translate(${tick.x},${tick.y})`}>
<text>
{parts.map((p, i) => (
<tspan x={0} dy={i === 0 ? 0 : 12}>
{p}
</tspan>
))}
</text>
</g>
)
}
}}
Оси в Nivo стилизуются через свойства:
axisLeft={{
tickSize: 0,
tickPadding: 12,
tickRotation: 0,
legend: 'Значения',
legendOffset: -40,
legendPosition: 'middle'
}}
Часто используется минималистичный стиль:
tickSize: 0)Для сложных графиков важно согласование:
Пример:
xScale={{ type: 'point' }}
yScale={{ type: 'linear', min: 0, max: 'auto' }}
При сравнении нескольких серий данных используется одинаковая шкала Y для избежания визуального искажения.
Если значения выходят за пределы шкалы:
autoРучной контроль:
yScale={{
type: 'linear',
min: 'auto',
max: 'auto'
}}
В некоторых композициях применяется двойная ось:
axisLeft={{ legend: 'Пользователи' }}
axisRight={{ legend: 'Конверсия' }}
Важно избегать несоразмерных шкал, иначе визуализация теряет интерпретируемость.
Корректный выбор шкалы определяет не только внешний вид графика, но и корректность восприятия трендов, особенно при анализе временных рядов и распределений.