В библиотеке Nivo визуализация накопительных рядов данных в областных
графиках строится на механизме стековой компоновки. Он определяет, как
значения нескольких серий накладываются друг на друга по оси Y, формируя
итоговую форму графика. Ключевой параметр, отвечающий за это поведение,
— stackOffset.
При построении стековых графиков каждая серия данных рассматривается как слой. Алгоритм компоновки определяет:
В Nivo для stackOffset доступны несколько стратегий,
среди которых три фундаментальные: none,
expand, wiggle.
Режим none задаёт классическую стековую компоновку без
нормализации и дополнительных трансформаций.
Каждое значение серии суммируется с предыдущими слоями, формируя абсолютную высоту.
Для серии ( i ) и точки ( x ):
[ y_{i}(x) = {k=0}^{i} v{k}(x)]
где:
import { ResponsiveArea } from '@nivo/area';
const MyChart = ({ data }) => (
<ResponsiveArea
data={data}
keys={['seriesA', 'seriesB', 'seriesC']}
indexBy="time"
stackOffset="none"
/>
);
Режим expand выполняет нормализацию значений, преобразуя
стек в процентное распределение. Итоговая высота каждого столбца всегда
равна 100%.
[ y_{i}(x) = ]
где знаменатель — сумма всех серий в точке ( x ).
import { ResponsiveArea } from '@nivo/area';
const MyChart = ({ data }) => (
<ResponsiveArea
data={data}
keys={['seriesA', 'seriesB', 'seriesC']}
indexBy="time"
stackOffset="expand"
/>
);
Режим wiggle реализует алгоритм, известный как
streamgraph-компоновка. Его задача — минимизировать «дрожание»
центральной линии и создать визуально плавное течение слоёв.
Этот метод используется для построения потоковых диаграмм, где важна эстетика формы и восприятие динамики.
Алгоритм стремится минимизировать суммарное смещение слоёв относительно центральной оси, перераспределяя базовую линию так, чтобы:
В отличие от none, где стек растёт вверх от нуля, и
expand, где всё нормируется, wiggle использует
адаптивную базовую линию, которая «плавает» между слоями.
Цель — минимизация функции:
[ (y_i(x) - y_{i-1}(x))^2]
в упрощённой форме, что приводит к более равномерному распределению изгибов.
import { ResponsiveArea } from '@nivo/area';
const StreamChart = ({ data }) => (
<ResponsiveArea
data={data}
keys={['seriesA', 'seriesB', 'seriesC']}
indexBy="time"
stackOffset="wiggle"
/>
);
none — сохраняет полностьюexpand — полностью нормируетwiggle — частично искажает ради формыnone — аналитическая точностьexpand — долевое распределениеwiggle — потоковая эстетикаnone — фиксированный нольexpand — фиксированная единицаwiggle — динамическая адаптивная линияИспользование none оправдано при необходимости
отображения реальных объёмов данных:
В таких сценариях важна точная высота стеков и их суммарное значение.
Режим expand применяется при исследовании относительных
вкладов:
Здесь ключевым является сравнение пропорций, а не абсолютных чисел.
wiggle используется для визуально сложных временных
рядов:
Основная задача — не точность, а восприятие динамики.
Внутренние алгоритмы стековой компоновки в Nivo выполняются на этапе подготовки данных перед рендерингом SVG или Canvas.
stackOffset;none — минимальная нагрузка, простое суммирование;expand — дополнительная операция нормализации на каждую
точку;wiggle — наиболее затратный режим из-за расчёта
сглаженной базовой линии.При больших наборах данных:
none масштабируется наиболее предсказуемо;expand требует стабильного суммирования для каждой оси
X;wiggle может увеличивать время подготовки данных из-за
вычисления оптимальной формы слоя.none корректно отображает пропуски как нули или
разрывы;expand перераспределяет доли даже при малых
значениях;wiggle может усиливать визуальные искажения при
нерегулярных рядах.Алгоритмы stackOffset работают совместно с типами кривых
(curve), влияя на итоговую форму:
wiggle;expand даёт наиболее стабильную
геометрию.