В библиотеке Nivo компонент Bar строится на основе табличной структуры данных, где каждая строка представляет категорию, а свойства объекта — числовые серии, отображаемые в виде столбцов.
Базовый формат:
const data = [
{
country: "AD",
"hot dog": 120,
burger: 80,
sandwich: 45,
kebab: 60,
fries: 20,
donut: 30
},
{
country: "AE",
"hot dog": 90,
burger: 60,
sandwich: 70,
kebab: 50,
fries: 10,
donut: 40
}
];
Каждый объект массива:
Ключевая особенность модели — отсутствие строгой схемы: структура
полностью определяется параметрами keys и
indexBy.
keys определяет, какие поля объекта данных будут
использованы как серии.
const keys = ["hot dog", "burger", "sandwich", "kebab", "fries", "donut"];
Если поле не указано в keys, оно игнорируется при
построении графика.
Связь между keys и данными:
keys задаёт набор визуализируемых метрикПараметр indexBy определяет поле, используемое как
категория (ось X или Y).
По умолчанию:
indexBy: "id"
Пример переопределения:
<ResponsiveBar
data={data}
keys={keys}
indexBy="country"
/>
В этом случае:
country становится категориейkeys)Структура зависит от выбранного поля:
Bar chart в Nivo поддерживает два основных режима визуализации серий:
Каждая категория отображает несколько отдельных столбцов рядом.
groupMode="grouped"
Особенности:
Серии накладываются друг на друга:
groupMode="stacked"
Особенности:
Структурно данные остаются одинаковыми, меняется только визуальная интерпретация.
Ориентация графика влияет на восприятие структуры данных, но не изменяет её форму.
layout="horizontal"
При горизонтальном режиме:
indexBy становится осью YПример логики:
Хотя Bar не является специализированным временным графиком, он часто используется для дискретных временных интервалов.
Пример:
const data = [
{ day: "2026-01-01", value: 10 },
{ day: "2026-01-02", value: 15 },
{ day: "2026-01-03", value: 7 }
];
Конфигурация:
<ResponsiveBar
data={data}
keys={["value"]}
indexBy="day"
/>
Особенности работы с датами:
Nivo корректно обрабатывает отсутствующие поля в объектах данных.
Пример:
const data = [
{ category: "A", apples: 10, oranges: 5 },
{ category: "B", apples: 0 },
{ category: "C", oranges: 8 }
];
Поведение:
Рекомендуется:
Часто исходные данные не соответствуют требованиям Bar и требуют преобразования.
Исходные данные:
const raw = [
{ region: "North", metrics: { sales: 100, profit: 30 } },
{ region: "South", metrics: { sales: 80, profit: 20 } }
];
Преобразование:
const data = raw.map(item => ({
region: item.region,
sales: item.metrics.sales,
profit: item.metrics.profit
}));
const apiData = {
"2026-01": { a: 10, b: 20 },
"2026-02": { a: 15, b: 25 }
};
Преобразование:
const data = Object.entries(apiData).map(([month, values]) => ({
month,
...values
}));
keys:
const keys = ["a", "b"];
При работе с необработанными API-данными часто требуется:
const normalize = (value) =>
typeof value === "number" ? value : 0;
Применение:
const data = raw.map(item => ({
category: item.category,
sales: normalize(item.sales),
profit: normalize(item.profit)
}));
const data = [
{ month: "Jan", mobile: 120, desktop: 200, tablet: 80 },
{ month: "Feb", mobile: 150, desktop: 180, tablet: 90 }
];
const keys = ["mobile", "desktop", "tablet"];
Используется для:
const data = [
{ product: "A", value: 30 },
{ product: "B", value: 45 },
{ product: "C", value: 25 }
];
const keys = ["value"];
Используется для:
const data = [
{ year: 2023, revenue: 1000, cost: 700 },
{ year: 2024, revenue: 1200, cost: 800 }
];
const keys = ["revenue", "cost"];
Используется для:
Если ключ отсутствует в объектах:
const keys = ["a", "b", "c"];
а c отсутствует в данных, серия будет пустой.
{ category: "A", value: "100" }
Строки могут приводить к некорректной визуализации. Значения должны быть числовыми.
Если indexBy указывает на несуществующее поле:
indexBy="id"
а id отсутствует, график теряет структуру категорий.
Nivo не сортирует данные автоматически:
[
{ month: "March" },
{ month: "January" },
{ month: "February" }
]
Порядок отрисовки будет таким же, как входной массив, если не выполнить сортировку заранее.
Формат данных напрямую влияет на:
Чем более предсказуемая структура данных, тем стабильнее визуальный результат при использовании Bar-компонента Nivo.