В библиотеке Nivo оси и тики являются одной из ключевых частей системы визуализации данных. Именно через них формируется восприятие масштаба, распределения значений и структуры графика. Настройка тиков затрагивает четыре основных аспекта: количество отображаемых делений, конкретные значения, геометрию (размеры линий и отступов) и визуальное оформление (цвет и стилизация).
Количество тиков на осях в Nivo может определяться автоматически или задаваться явно.
В большинстве компонентов (например, ResponsiveLine,
ResponsiveBar) количество тиков рассчитывается
автоматически на основе:
Автоматическое поведение используется по умолчанию и обеспечивает читаемость графика без дополнительных настроек.
Пример:
<ResponsiveLine
data={data}
margin={{ top: 50, right: 110, bottom: 50, left: 60 }}
axisBottom={{
tickSize: 5,
tickPadding: 5,
tickRotation: 0
}}
/>
В этом случае Nivo сам определяет количество тиков по оси X.
Параметр tickCount задаёт ориентировочное число
тиков:
axisBottom={{
tickCount: 8
}}
Особенности:
Наиболее точный способ управления количеством — указание конкретных значений:
axisBottom={{
tickValues: [0, 20, 40, 60, 80, 100]
}}
Или для дат:
axisBottom={{
tickValues: [
'2023-01-01',
'2023-02-01',
'2023-03-01'
]
}}
Использование tickValues полностью отключает
автоматическую генерацию и фиксирует структуру оси.
Значения тиков в Nivo могут быть числовыми, строковыми или временными.
Наиболее распространённый случай:
axisLeft={{
tickValues: [0, 10, 20, 30, 40]
}}
Используется для линейных шкал, статистических данных, метрик производительности.
Применяются для категориальных данных:
axisBottom={{
tickValues: ['A', 'B', 'C', 'D']
}}
Часто используется в bar charts, где каждая категория имеет фиксированное имя.
Nivo поддерживает работу с временными шкалами через строки дат или объекты Date:
axisBottom={{
tickValues: [
new Date(2024, 0, 1),
new Date(2024, 1, 1),
new Date(2024, 2, 1)
]
}}
При использовании временных осей важно учитывать:
format);Параметр format позволяет преобразовать отображаемое
значение:
axisLeft={{
format: value => `${value}%`
}}
Для дат:
axisBottom={{
format: value => new Date(value).getFullYear()
}}
Форматирование не влияет на вычисления, только на отображение.
Размер тиков управляется несколькими параметрами: длиной линии, отступами и углом поворота.
Определяет длину линии тика:
axisLeft={{
tickSize: 8
}}
Определяет расстояние между линией тика и подписью:
axisBottom={{
tickSize: 5,
tickPadding: 12
}}
Большие значения полезны при:
Позволяет поворачивать подписи:
axisBottom={{
tickRotation: 45
}}
Используется при:
Типичная конфигурация для компактного графика:
axisBottom={{
tickSize: 4,
tickPadding: 8,
tickRotation: 30
}}
Такая настройка уменьшает визуальный шум и предотвращает наложение текста.
В Nivo цвет тиков не задаётся отдельным параметром напрямую в
axis-конфигурации (в большинстве компонентов). Вместо этого используется
система theme.
theme={{
axis: {
ticks: {
text: {
fill: '#333333'
},
line: {
stroke: '#999999',
strokeWidth: 1
}
}
}
}}
Определяется через:
theme={{
axis: {
ticks: {
text: {
fill: '#1f2937'
}
}
}
}}
Используется для:
Линии тиков управляются отдельно:
theme={{
axis: {
ticks: {
line: {
stroke: '#e5e7eb',
strokeWidth: 1
}
}
}
}}
Изменение цвета линий особенно важно при:
При выборе цвета тиков учитывается фон графика:
Пример тёмной темы:
theme={{
axis: {
ticks: {
text: {
fill: '#f9fafb'
},
line: {
stroke: '#6b7280'
}
}
}
}}
Настройка тиков представляет собой систему взаимосвязанных параметров:
tickValues задаёт структуру;tickCount регулирует плотность при автоматическом
режиме;tickSize влияет на визуальную иерархию;tickPadding определяет читаемость подписей;tickRotation решает проблему перегруженности;theme формирует визуальный стиль.При конфликте параметров приоритет имеет явное определение значений
через tickValues, затем tickCount, и только
после этого автоматическая генерация.
Оси отсутствуют, но аналогичные принципы применяются к сегментам и меткам.
axisLeft={{
tickSize: 0,
tickPadding: 10
}}
axisLeft={{
tickCount: 10,
tickSize: 6,
tickPadding: 8
}}
axisBottom={{
tickValues: ['Очень длинное название 1', 'Название 2', 'Название 3'],
tickRotation: 45,
tickPadding: 12
}}
axisBottom={{
format: value => new Date(value).toLocaleDateString(),
tickValues: 'every 1 month',
tickRotation: 0
}}