Bar-чарт в Nivo представляет собой гибкий компонент для визуализации категориальных данных через прямоугольные столбцы. Он поддерживает как вертикальную, так и горизонтальную ориентацию, позволяя адаптировать график под структуру данных, плотность подписей и требования интерфейса.
Ключевая особенность реализации заключается в декларативной модели конфигурации: разработчик описывает данные и параметры отображения, а библиотека самостоятельно управляет масштабированием, анимацией и отрисовкой через SVG или Canvas.
Данные для Bar-чарта в Nivo представляют собой массив объектов, где каждый объект соответствует категории (группе), а его свойства — значения подкатегорий.
const data = [
{
country: "Kazakhstan",
sales: 120,
profit: 80
},
{
country: "Russia",
sales: 200,
profit: 130
}
];
Ключевой момент: структура данных должна быть согласована с
keys — списком полей, которые будут визуализироваться как
отдельные серии.
keys={["sales", "profit"]}
indexBy="country"
indexBy определяет категорию (ось X или Y в зависимости
от ориентации)keys определяет набор числовых метрикВертикальный Bar-чарт является стандартным вариантом отображения, где категории располагаются по оси X, а значения растут по оси Y.
import { ResponsiveBar } from '@nivo/bar'
<ResponsiveBar
data={data}
keys={["sales", "profit"]}
indexBy="country"
margin={{ top: 50, right: 130, bottom: 50, left: 60 }}
padding={0.3}
axisBottom={{
tickRotation: -45
}}
/>
Nivo автоматически применяет линейный масштаб для оси значений. При этом диапазон вычисляется динамически на основе максимального значения всех series.
Важный аспект — контроль padding между столбцами:
padding: 0 — плотная упаковкаpadding: 0.3 — сбалансированный вариантpadding > 0.5 — визуально разреженные данныеГоризонтальная ориентация меняет оси местами: категории становятся по вертикали, а значения вытягиваются по горизонтали.
<ResponsiveBar
data={data}
keys={["sales", "profit"]}
indexBy="country"
layout="horizontal"
margin={{ top: 50, right: 130, bottom: 50, left: 80 }}
padding={0.3}
/>
Горизонтальный формат особенно эффективен в следующих случаях:
axisBottom заменяется на axisLeft как
основная категориальная осьBar в Nivo обладает большим количеством настроек, влияющих на поведение и внешний вид.
data={data}
keys={["sales", "profit"]}
indexBy="country"
data — исходный массивkeys — набор метрикindexBy — поле группировкиОшибки конфигурации здесь приводят к пустому графику или NaN-значениям, так как Nivo строго сопоставляет ключи.
margin={{ top: 40, right: 80, bottom: 60, left: 60 }}
padding={0.25}
margin отвечает за пространство для осей и
подписейpadding управляет расстоянием между столбцами внутри
категорииvalueScale={{ type: "linear" }}
indexScale={{ type: "band", round: true }}
valueScale определяет числовую шкалу (обычно
linear)indexScale управляет категорией (band — дискретные
группы)Оси в Bar-чартах Nivo — это независимые конфигурационные блоки.
axisBottom={{
tickSize: 5,
tickPadding: 5,
tickRotation: 0,
legend: "Страны",
legendPosition: "middle",
legendOffset: 40
}}
axisLeft={{
tickSize: 5,
tickPadding: 5,
legend: "Значения",
legendPosition: "middle",
legendOffset: -50
}}
tickRotation помогает избежать наложения текстаlegendOffset критичен для читаемостиЦвета можно задавать несколькими способами.
colors={{ scheme: "nivo" }}
Другие схемы:
category10accentdark2pairedcolors={(bar) => {
if (bar.id === "sales") return "#4caf50";
return "#2196f3";
}}
Это позволяет привязывать цвет к конкретной серии данных.
Bar-компонент поддерживает отображение значений прямо на столбцах.
labelSkipWidth={12}
labelSkipHeight={12}
labelTextColor="#ffffff"
labelSkipWidth, текст
скрываетсяBar может работать в двух режимах: grouped и stacked.
groupMode="grouped"
groupMode="stacked"
Пример интерпретации:
Nivo использует плавные переходы на основе интерполяции значений.
animate={true}
motionConfig="gentle"
motionConfig: "wobbly" — более выраженные эффектыgentle — стандартный балансstiff — минимальная инерцияАнимации применяются к:
Tooltip позволяет отображать детализированную информацию при наведении.
tooltip={({ id, value, color }) => (
<div style={{ padding: 12 }}>
<strong style={{ color }}>{id}</strong>: {value}
</div>
)}
Bar может отрисовываться двумя способами:
<ResponsiveBar
data={data}
renderWrapper={false}
/>
Canvas режим предпочтителен при:
SVG предпочтителен при:
Bar-чарты часто используются внутри dashboard-систем и аналитических панелей. В таких случаях важны:
<div style={{ height: 400 }}>
<ResponsiveBar {...props} />
</div>
Без фиксированной высоты компонент не сможет корректно вычислить размеры SVG-контейнера.
Bar-компонент ожидает корректный числовой ввод. При нарушении структуры возможны:
Типичная защита:
const safeData = data.filter(d => typeof d.sales === "number")
Порядок отображения определяется массивом keys:
keys={["profit", "sales"]}
Это влияет на:
legends={[
{
dataFrom: "keys",
anchor: "bottom-right",
direction: "column",
translateX: 120,
itemWidth: 100,
itemHeight: 20
}
]}
Легенда важна при наличии нескольких метрик, иначе интерпретация графика становится неоднозначной.
При работе с большими наборами данных критичны:
animate={false}
motionConfig="none"
Это снижает нагрузку при частых обновлениях данных.
ResponsiveBar автоматически пересчитывает:
Важное ограничение: контейнер должен иметь ненулевые размеры при первом рендере, иначе график не инициализируется корректно.