Система шкал Nivo: linear, log, symlog, time, point, band

В библиотеке Nivo визуализация данных строится вокруг строгого разделения между данными и их отображением на координатной плоскости. Центральным механизмом этого преобразования выступают шкалы (scales), определяющие, как значения домена (domain) переводятся в пиксельные координаты диапазона (range). Внутри Nivo используется подход, основанный на концепциях D3-scale, где каждая шкала представляет собой функцию отображения данных в визуальное пространство графика.

Шкалы задаются отдельно для осей X и Y и являются ключевым элементом конфигурации компонентов ResponsiveLine, ResponsiveBar, ResponsiveScatterPlot и других графиков. В типичной конфигурации шкала описывается через объект xScale или yScale, где указывается тип преобразования и дополнительные параметры.


Линейная шкала (linear)

Линейная шкала является базовым типом преобразования числовых данных. Она используется, когда значения равномерно распределены и нет необходимости в нелинейной трансформации.

Характеристики линейной шкалы:

  • непрерывный числовой домен;
  • равномерное отображение значений;
  • поддержка отрицательных и положительных чисел;
  • основа большинства стандартных графиков.

Пример конфигурации:

xScale={{
    type: 'linear',
    min: 0,
    max: 'auto'
}}
yScale={{
    type: 'linear',
    min: 0,
    max: 100,
    stacked: false,
    reverse: false
}}

Параметр min и max задаёт границы домена. Значение 'auto' позволяет Nivo автоматически вычислить пределы на основе входных данных. Опция stacked применяется в столбчатых графиках и влияет на накопление значений.

Линейная шкала используется по умолчанию в большинстве случаев, когда данные представляют собой непрерывные измерения: температура, значения метрик, финансовые показатели.


Логарифмическая шкала (log)

Логарифмическая шкала применяется для данных с экспоненциальным ростом или сильной диспропорцией значений. Она позволяет визуализировать широкий диапазон данных, сжимая большие значения и растягивая малые.

Основные свойства:

  • нелинейное отображение;
  • использование логарифмической функции;
  • невозможность работы с нулём и отрицательными числами;
  • подходит для данных с порядками величин.

Пример:

xScale={{
    type: 'log',
    base: 10,
    min: 1,
    max: 'auto'
}}

Параметр base задаёт основание логарифма. Чаще всего используется 10 или e. Важно учитывать, что значения домена должны быть строго положительными.

Логарифмическая шкала часто используется для:

  • финансовых графиков с резкими скачками;
  • научных данных (например, интенсивность сигналов);
  • анализа распределений с тяжёлыми хвостами.

Симметричная логарифмическая шкала (symlog)

SymLog (symmetric log scale) представляет собой гибрид линейной и логарифмической шкалы. Она позволяет работать с данными, содержащими нулевые и отрицательные значения, сохраняя при этом логарифмическое сжатие для больших величин.

Ключевая особенность — наличие зоны линейного отображения вокруг нуля.

Основные параметры:

yScale={{
    type: 'symlog',
    constant: 1,
    min: -100,
    max: 100
}}

Параметр constant определяет область линейного поведения вокруг нуля. Чем больше значение, тем шире линейная зона.

Поведение:

  • около нуля — линейное отображение;
  • при удалении от нуля — логарифмическое сжатие;
  • поддержка отрицательных значений.

Применение:

  • финансовые данные с убытками и прибылями;
  • научные измерения с переходом через ноль;
  • данные с высокой асимметрией распределения.

Шкала времени (time)

Шкала времени используется для работы с датами и временными рядами. Она преобразует объекты Date в координаты на основе временной оси.

Особенности:

  • поддержка JavaScript Date объектов;
  • интерполяция между временными метками;
  • корректная обработка нерегулярных интервалов;
  • автоматическая нормализация временных диапазонов.

Пример:

xScale={{
    type: 'time',
    format: 'native',
    precision: 'day',
    useUTC: false,
    min: new Date('2024-01-01'),
    max: new Date('2024-12-31')
}}

Параметр precision определяет уровень детализации (день, час, месяц и т.д.). format: 'native' означает использование стандартных Date-объектов без предварительного парсинга строк.

Шкала времени применяется в:

  • графиках временных рядов;
  • аналитике поведения пользователей;
  • мониторинге метрик во времени;
  • финансовых таймсериях.

Точечная шкала (point)

Point scale — это разновидность ordinal-шкалы, в которой каждому значению домена соответствует фиксированная точка на оси. Расстояние между точками одинаковое.

Особенности:

  • дискретные значения;
  • равномерное распределение категорий;
  • отсутствие ширины элементов (в отличие от band);
  • используется для линий и scatter-графиков.

Пример:

xScale={{
    type: 'point'
}}

Используется, когда данные представляют собой набор категорий без количественной интерпретации расстояний между ними:

  • дни недели;
  • категории продуктов;
  • фиксированные метки.

Point-scale часто применяется в линейных графиках с категориальной осью X.


Полосовая шкала (band)

Band scale используется для визуализации категориальных данных с учётом ширины каждого элемента. Это основной тип шкалы для столбчатых диаграмм.

Характерные особенности:

  • каждая категория получает «полосу» фиксированной ширины;
  • между полосами есть отступы;
  • поддержка внутреннего и внешнего padding;
  • вычисление bandwidth для элементов.

Пример:

xScale={{
    type: 'band',
    padding: 0.3
}}

Дополнительные параметры:

yScale={{
    type: 'linear',
    min: 0,
    max: 'auto'
}}

Параметр padding регулирует расстояние между столбцами. Значение 0 означает отсутствие промежутков, значение ближе к 1 увеличивает расстояния.

Band scale применяется в:

  • столбчатых диаграммах;
  • группированных bar charts;
  • stacked bar визуализациях.

Взаимодействие шкал с компонентами Nivo

Каждый компонент Nivo интерпретирует шкалы по-разному в зависимости от типа визуализации.

В ResponsiveLine:

  • xScale чаще всего linear, time или point;
  • yScale — непрерывная шкала (linear или symlog).

В ResponsiveBar:

  • xScale почти всегда band;
  • yScale — linear или stacked linear.

В ResponsiveScatterPlot:

  • обе оси используют linear или time;
  • важна точная числовая интерпретация координат.

Пример комбинированной конфигурации:

xScale={{
    type: 'time',
    format: 'native',
    precision: 'day'
}}

yScale={{
    type: 'linear',
    min: 0,
    max: 'auto'
}}

Домены и диапазоны шкал

Каждая шкала в Nivo оперирует двумя фундаментальными понятиями:

  • domain — исходный набор значений;
  • range — диапазон пикселей на графике.

Хотя Nivo часто автоматически вычисляет domain, его можно задавать явно:

xScale={{
    type: 'linear',
    min: 0,
    max: 100
}}

Для временных шкал:

xScale={{
    type: 'time',
    min: new Date('2024-01-01'),
    max: new Date('2024-12-31')
}}

Автоматическое определение домена позволяет адаптировать график под входные данные, однако явная настройка используется при необходимости фиксированной визуальной структуры.


Особенности поведения шкал при масштабировании данных

При изменении диапазонов данных Nivo пересчитывает шкалы динамически. Это влияет на:

  • плотность тиков;
  • интервал подписей осей;
  • распределение элементов;
  • визуальную стабильность графика.

Логарифмические и symlog шкалы требуют особого внимания при анимациях, поскольку изменение домена может резко менять визуальное расстояние между точками.


Итоговая структура типов шкал в системе Nivo

  • linear — универсальная числовая шкала;
  • log — логарифмическая шкала для экспоненциальных данных;
  • symlog — гибридная шкала для данных с нулём и отрицательными значениями;
  • time — временная шкала для дат и временных рядов;
  • point — дискретная точечная шкала;
  • band — категориальная шкала с шириной элементов.