Nivo — библиотека визуализации данных, построенная на основе React-экосистемы и ориентированная на создание сложных интерактивных графиков без необходимости напрямую работать с низкоуровневыми примитивами SVG и Canvas. В основе архитектуры лежит модульный подход: каждый тип графика поставляется как отдельный пакет, что позволяет подключать только необходимый функционал и снижать итоговый размер сборки.
Библиотека распространяется как набор scoped-пакетов npm,
начинающихся с @nivo/. Такой подход обеспечивает
независимость графиков друг от друга и упрощает управление зависимостями
в проектах.
Ключевые пакеты:
@nivo/core — базовые утилиты и общие компоненты@nivo/bar — столбчатые диаграммы@nivo/line — линейные графики@nivo/pie — круговые диаграммы@nivo/scatterplot — диаграммы рассеяния@nivo/geo — географические картыОсновная зависимость — React. Библиотека не предназначена для использования вне React-окружения.
npm install @nivo/core @nivo/bar
При установке часто подключается только нужный пакет визуализации. Например, для линейных графиков:
npm install @nivo/core @nivo/line
yarn add @nivo/core @nivo/bar
pnpm add @nivo/core @nivo/bar
Если проект не содержит React, необходимо установить его явно:
npm install react react-dom
Современные сборщики (Vite, Next.js, CRA) уже включают базовую конфигурацию React, поэтому дополнительная настройка обычно не требуется.
Типовая структура React-приложения с Nivo:
src/
├── components/
│ └── BarChart.jsx
├── data/
│ └── salesData.js
├── App.jsx
└── main.jsx
Данные для графика выносятся отдельно, чтобы обеспечить переиспользование компонентов визуализации.
export const salesData = [
{
country: "USA",
"2023": 120,
"2024": 150
},
{
country: "Germany",
"2023": 98,
"2024": 110
},
{
country: "Japan",
"2023": 86,
"2024": 95
}
];
Наиболее распространённый стартовый элемент — столбчатая диаграмма
(Bar). Она хорошо демонстрирует базовую модель работы Nivo:
данные → маппинг → рендеринг.
import { ResponsiveBar } from "@nivo/bar";
import React from "react";
import { ResponsiveBar } from "@nivo/bar";
import { salesData } from "../data/salesData";
const BarChart = () => {
return (
<div style={{ height: 400 }}>
<ResponsiveBar
data={salesData}
keys={["2023", "2024"]}
indexBy="country"
margin={{ top: 50, right: 50, bottom: 50, left: 60 }}
padding={0.3}
colors={{ scheme: "nivo" }}
axisBottom={{
tickSize: 5,
tickPadding: 5,
tickRotation: 0,
legend: "Страны",
legendPosition: "middle",
legendOffset: 40
}}
axisLeft={{
tickSize: 5,
tickPadding: 5,
tickRotation: 0,
legend: "Продажи",
legendPosition: "middle",
legendOffset: -50
}}
/>
</div>
);
};
export default BarChart;
Компонент графика подключается на уровне корневого приложения.
import React from "react";
import BarChart from "./components/BarChart";
const App = () => {
return (
<div>
<h1>Аналитика продаж</h1>
<BarChart />
</div>
);
};
export default App;
import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
ReactDOM.createRoot(document.getElementById("root")).render(
<React.StrictMode>
<App />
</React.StrictMode>
);
Одной из ключевых особенностей Nivo является использование responsive-компонентов. Они автоматически подстраиваются под размеры родительского контейнера.
Важно учитывать:
Пример критического требования:
<div style={{ height: 500 }}>
<ResponsiveBar {...props} />
</div>
Массив объектов, содержащих измерения и значения. Структура должна
быть согласована с keys и indexBy.
Определяет поля значений, которые будут визуализированы.
keys={["2023", "2024"]}
Определяет категориальную ось:
indexBy="country"
Nivo предоставляет встроенные палитры:
nivocategory10accentpairedПример:
colors={{ scheme: "accent" }}
Цветовая система основана на предопределённых наборах D3-подобных палитр и может быть расширена кастомными функциями.
При первом запуске компонента происходит:
Анимации включены по умолчанию и управляются через
motion параметры.
animate={false}
или
motionConfig="wobbly"
(конфигурации motion основаны на react-spring)
Основная причина — отсутствие высоты у контейнера.
Возникает при рендере без корректного layout-обёртывания.
Если data пустой массив, Nivo отрисовывает оси без
значений.
Библиотека допускает одновременное использование разных типов визуализации.
npm install @nivo/line @nivo/pie
Каждый график работает независимо, что позволяет комбинировать визуализации в одном интерфейсе без конфликтов состояния.
При разработке полезно включать упрощённые настройки:
Это ускоряет итерации и упрощает диагностику поведения рендера.