Компонент Stream из набора визуализаций Nivo предназначен для отображения многослойных временных или категориальных потоков данных, где каждая серия представляет вклад в общую изменяющуюся величину. В отличие от классической stacked area диаграммы, Stream делает акцент не на абсолютных значениях, а на форме распределения и динамике долей между категориями.
Основная идея заключается в визуализации «течения» данных, где каждая категория представлена слоем, а суммарная форма может быть нормализована различными алгоритмами смещения (offsets), создающими характерные волнообразные структуры.
Данные для Stream строятся в виде массива объектов, где каждый объект представляет точку по оси X, а свойства объекта — значения категорий.
Пример структуры:
const data = [
{
day: '2024-01-01',
cats: 120,
dogs: 80,
birds: 50
},
{
day: '2024-01-02',
cats: 150,
dogs: 60,
birds: 40
}
];
Ключевые параметры:
day)cats,
dogs, birds)Stream реализуется через @nivo/stream и используется как
React-компонент:
import { ResponsiveStream } from '@nivo/stream';
const MyStream = ({ data }) => (
<ResponsiveStream
data={data}
keys={['cats', 'dogs', 'birds']}
indexBy="day"
margin={{ top: 50, right: 110, bottom: 50, left: 60 }}
/>
);
Компонент автоматически рассчитывает слои и применяет выбранный алгоритм нормализации.
Одна из ключевых особенностей Stream — различные режимы распределения слоёв.
Минимизирует «дрожание» слоёв, создавая плавную органическую форму.
Используется для:
Нормализует данные так, что сумма всех слоёв всегда равна 100%.
offset: 'expand'
Применение:
Обычное накопительное сложение без нормализации.
Используется редко, так как теряется визуальная «потоковость».
Центрирует слои вокруг нулевой линии, создавая симметричную форму.
Stream позволяет управлять стилем каждого слоя через свойства:
<ResponsiveStream
data={data}
keys={['cats', 'dogs', 'birds']}
offset="wiggle"
curve="catmullRom"
areaOpacity={0.85}
borderWidth={1}
borderColor={{ from: 'color', modifiers: [['darker', 0.3]] }}
/>
Ключевые параметры:
Форма потоков определяется параметром curve.
Наиболее используемые варианты:
catmullRom — плавные естественные линииbasis — сглаженные кривые без острых угловlinear — прямолинейные переходыmonotoneX — стабильная форма без колебанийПример:
curve="monotoneX"
Выбор кривой напрямую влияет на восприятие динамики данных.
Stream активно использует цветовое разделение категорий.
colors={{ scheme: 'nivo' }}
Также возможно задание кастомной функции:
colors={(serie) => {
if (serie.id === 'cats') return '#ff6b6b';
if (serie.id === 'dogs') return '#4dabf7';
return '#51cf66';
}}
Особенность Stream заключается в том, что цвет слоя сохраняется вдоль всей его длины, обеспечивая визуальную непрерывность.
Stream поддерживает стандартные оси Nivo:
axisBottom={{
tickSize: 5,
tickPadding: 5,
tickRotation: -45
}}
axisLeft={{
tickSize: 5,
tickPadding: 5
}}
При использовании expand значения оси Y преобразуются в
диапазон от 0 до 1, что требует корректного форматирования меток:
axisLeft={{
format: v => `${Math.round(v * 100)}%`
}}
Stream предоставляет детализированные всплывающие подсказки, содержащие информацию о каждом слое.
tooltip={({ stack }) => (
<div>
<strong>{stack.id}</strong>: {stack.value}
</div>
)}
Доступные данные в tooltip:
Добавление легенды повышает читаемость графика:
legends={[
{
anchor: 'right',
direction: 'column',
translateX: 100,
itemWidth: 80,
itemHeight: 20,
symbolSize: 12
}
]}
Легенды особенно важны при большом количестве ключей, так как Stream может содержать десятки слоёв.
Stream включает встроенную систему плавных переходов:
animate={true}
motionConfig="stiff"
Основные параметры:
При изменении данных слои перерассчитываются с плавным перераспределением формы.
Stream чувствителен к:
При отсутствии значения в точке рекомендуется явно указывать
0, чтобы избежать разрывов в слоях.
Для повышения различимости слоёв можно использовать паттерны:
patterns={[
{
id: 'dots',
type: 'dots',
background: 'inherit',
color: 'rgba(255,255,255,0.3)',
size: 4
}
]}
Применение:
fill={[
{ match: { id: 'cats' }, id: 'dots' }
]}
Паттерны полезны при печати и при дальтонической адаптации интерфейсов.
Stream относится к визуализациям средней сложности. Основные факторы нагрузки:
Рекомендации:
Stream применяется в задачах, где важна структура распределения:
Особенность формата заключается в том, что он подчёркивает не абсолютные значения, а динамику относительных вкладов.
Несмотря на внешнее сходство, Stream отличается фундаментально:
Это делает Stream менее точным, но более выразительным в задачах анализа трендов распределения.