Компонент Calendar в библиотеке визуализации Nivo
предназначен для отображения временных рядов в виде календарной тепловой
карты, где каждый день года представлен отдельной ячейкой с
интенсивностью цвета, зависящей от значения метрики. Годовое
представление является базовым режимом, в котором данные распределяются
по неделям и месяцам, формируя компактную визуализацию активности за
длительный период.
Календарь опирается на простой формат данных, где каждый элемент соответствует одному дню:
const data = [
{ day: '2026-01-01', value: 12 },
{ day: '2026-01-02', value: 8 },
{ day: '2026-01-03', value: 0 }
];
Ключевые требования к данным:
day — строка в формате ISO 8601
(YYYY-MM-DD)value — числовое значение, определяющее интенсивность
цветаДопускается передача неполных наборов данных: календарь автоматически заполняет пропущенные дни нулевыми значениями при необходимости визуализации полного диапазона.
Годовое представление задаётся через параметры from и
to:
from="2026-01-01"
to="2026-12-31"
Особенности обработки диапазона:
При изменении диапазона происходит полная переразметка сетки, включая перераспределение недель и месяцев.
Стандартная настройка годового календаря включает минимальный набор параметров:
import { ResponsiveCalendar } from '@nivo/calendar'
<ResponsiveCalendar
data={data}
from="2026-01-01"
to="2026-12-31"
emptyColor="#eeeeee"
colors={['#d0e1ff', '#7aa6ff', '#3b6cff', '#1d3cff']}
margin={{ top: 50, right: 30, bottom: 40, left: 30 }}
/>
Основные параметры:
data — массив значений по днямfrom, to — временной диапазонemptyColor — цвет отсутствующих значенийcolors — шкала интенсивностиmargin — отступы контейнераГодовая визуализация формируется на основе недельной структуры:
Геометрия рассчитывается динамически, что позволяет адаптировать сетку под любой размер контейнера без потери пропорций.
Цветовая интерполяция в календаре задаётся через массив
colors, который определяет дискретные уровни
интенсивности.
Принцип работы:
Пример расширенной шкалы:
colors={[
'#edf8fb',
'#b3cde3',
'#8c96c6',
'#8856a7',
'#810f7c'
]}
Также возможно использование логарифмического распределения для данных с сильной асимметрией, например, при анализе активности пользователей или событийных потоков.
Каждая ячейка календаря представляет отдельный день и поддерживает несколько уровней кастомизации:
Дополнительно можно управлять:
Tooltip формируется на основе значения дня и даты:
tooltip={({ day, value }) => (
<div>
<strong>{day}</strong>
<div>{value}</div>
</div>
)}
Интерактивные особенности:
При больших наборах данных hover-логика оптимизирована через делегирование событий на SVG-слой.
Годовой календарь автоматически добавляет:
Настройки текстовых элементов:
monthSpacing — расстояние между месяцамиmonthBorderColor — цвет разделителяdayBorderWidth — толщина границ днейМесяцы вычисляются на основе календарной сетки, а не исходного массива данных, что обеспечивает корректное отображение даже при неполных диапазонах.
Компонент поддерживает различные варианты ориентации недель:
Это влияет на распределение строк в сетке и визуальное смещение всей структуры календаря.
Также возможно скрытие подписей дней недели для компактного отображения в дашбордах.
Годовое представление охватывает до 365–366 ячеек, что само по себе не является тяжёлой нагрузкой, однако оптимизация важна при:
Оптимизационные механизмы:
ResponsiveCalendar для адаптивного
рендераКомпонент использует контейнерный подход:
Важная особенность: при изменении размера не происходит пересоздание данных, только перерасчёт координат.
Глобальная стилизация осуществляется через объект
theme:
theme={{
textColor: '#333',
fontSize: 12,
tooltip: {
container: {
background: '#fff',
color: '#000'
}
}
}}
Поддерживаемые элементы:
Отсутствующие данные могут трактоваться по-разному:
Визуально такие дни выделяются отдельным цветом
emptyColor, что позволяет отделить их от минимальных
значений.
Дата day интерпретируется как локальная или
UTC-зависимая строка в зависимости от источника данных. При построении
календаря важно учитывать:
Годовой календарь часто используется как компонент аналитических панелей:
Комбинирование с другими графиками Nivo позволяет связывать календарную динамику с агрегированными метриками по месяцам и неделям.
При изменении входного массива:
Это позволяет использовать календарь в потоковых сценариях обновления данных без полной перерисовки.