логотип PurpleSchool
логотип PurpleSchool

Использование Chart.js в React

Автор

Олег Марков

Введение

Визуализация данных — неотъемлемая часть современного веба. Графики позволяют легче понять тренды и делать выводы на основе информации. В мире React вы найдете много решений для диаграмм, но одним из самых популярных считается Chart.js — мощная и гибкая JavaScript библиотека с поддержкой разных типов графиков и отличной документацией. В этой статье вы узнаете, как интегрировать Chart.js в React-приложение, строить основные типы графиков, делать их интерактивными и кастомизировать под задачи вашего проекта.

Почему именно Chart.js в паре с React

Chart.js славится простотой, богатым набором функций, возможностью кастомизации и поддержкой самых разных типов диаграмм — от стандартных столбчатых и линейных до "пончиковых" и радужных графиков. Однако Chart.js — это чисто JS библиотека: она напрямую работает с canvas и DOM, а управление жизненным циклом компонентов React — особенная задача. Для удобной интеграции часто используют специальные "обертки", такие как react-chartjs-2.

Установка необходимых библиотек

Перед тем как приступить к практике, давайте подключим Chart.js в проект.

npm install chart.js react-chartjs-2
  • chart.js — сама библиотека для отрисовки графиков
  • react-chartjs-2 — адаптер, который превращает Chart.js-компоненты в полноценные React-компоненты

Основы использования Chart.js в React

Быстрый старт: построение первого графика

Сейчас покажу простой пример рисования линейного графика.

Импортируем необходимые компоненты

import { Line } from 'react-chartjs-2'; // Импортируем компонент линии
import {
  Chart as ChartJS,
  CategoryScale,
  LinearScale,
  PointElement,
  LineElement,
  Title,
  Tooltip,
  Legend
} from 'chart.js';

// Регистрируем нужные модули Chart.js (обязательный шаг)
ChartJS.register(
  CategoryScale, LinearScale, PointElement, LineElement, Title, Tooltip, Legend
);

Определяем данные и опции графика

const data = {
  labels: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн'],
  datasets: [
    {
      label: 'Продажи',
      data: [150, 200, 180, 220, 210, 250], // Здесь сами значения
      fill: false, // Без заливки под кривой
      borderColor: 'rgba(75,192,192,1)', // Цвет линии
      tension: 0.1, // Плавность кривой
    },
  ],
};

const options = {
  responsive: true, // Масштабируется под контейнер
  plugins: {
    legend: {
      display: true,
      position: 'top', // Положение легенды
    },
    title: {
      display: true,
      text: 'График продаж по месяцам', // Название графика
    },
  },
};

Встраиваем график в компонент

function SalesLineChart() {
  return (
    <div style={{ height: 400, width: 600 }}>
      <Line data={data} options={options} /> {/* Рисуем! */}
    </div>
  );
}

// Теперь можно использовать <SalesLineChart /> в любом месте React-приложения

Здесь мы задали линии, подписи, цвет и отобразили график. Chart.js автоматически обработает все взаимодействия с мышью, легенды и текущие значения точек.

Доступные типы графиков и их компоненты

react-chartjs-2 поддерживает почти все стандартные виды графиков Chart.js:

  • Line — линейный график
  • Bar — столбчатый график
  • Doughnut — "пончиковый" график
  • Pie — круговая диаграмма
  • Radar — радиальный график
  • PolarArea — полярная область
  • и другие (Bubble, Scatter)

Покажу, как на лету менять вид графика — например, строить столбчатую диаграмму:

import { Bar } from 'react-chartjs-2';

function SalesBarChart() {
  return <Bar data={data} options={options} />;
}

Вы можете использовать один и тот же набор данных для разных типов графиков, просто меняя компонент!

Chart.js - это библиотека для создания интерактивных графиков и диаграмм в веб-приложениях. Интеграция Chart.js с React позволяет легко добавлять графики в React-приложения и визуализировать данные. Если вы хотите научиться использовать Chart.js в React и создавать красивые и информативные графики — приходите на наш большой курс Основы React, React Router и Redux Toolkit. На курсе 177 уроков и 17 упражнений, AI-тренажеры для безлимитной практики с кодом и задачами 24/7, решение задач с живым ревью наставника, еженедельные встречи с менторами.

Структура данных и опций: Как всё устроено

Пояснение по структуре data

Ключевое — массив datasets. Каждый элемент — это линия/серия на графике.

const data = {
  labels: ['A', 'B', 'C'],
  datasets: [
    {
      label: 'Значения A',
      data: [10, 20, 30],
      backgroundColor: 'rgba(255,99,132,0.5)', // Для bar/pie
      borderColor: 'rgba(255,99,132,1)', // Для line
    }
  ]
};
  • labels — подписи для оси X
  • datasets — массив объектов, в каждом из которых:
    • label — подпись серии
    • data — массив значений
    • цветовые и стилистические параметры

Основные опции (options)

Опции настраивают управление осями, легендами, подписями, обработчиками событий, масштабирование и многое другое.

const options = {
  scales: {
    y: {
      beginAtZero: true, // Ось Y начинается с 0
      title: { display: true, text: 'Количество' }
    },
    x: {
      title: { display: true, text: 'Период' }
    },
  },
  plugins: {
    legend: {
      display: true,
      position: 'bottom'
    }
  }
};

Кастомизация графиков: Цвета, стили, точки

Изменение цветов и оформления

Можно использовать как строки с CSS-цветами, так и массивы цветов (свойство применится к каждому сегменту):

const data = {
  labels: ['A', 'B', 'C'],
  datasets: [
    {
      label: 'Пример',
      data: [100, 200, 300],
      backgroundColor: [
        'rgba(255, 99, 132, 0.7)',
        'rgba(54, 162, 235, 0.7)',
        'rgba(255, 206, 86, 0.7)'
      ],
      borderWidth: 2, // Толщина линий/границ
    }
  ]
};
  • Для линейных — используйте borderColor и backgroundColor
  • Для "пончиков"/"пирогов" — передавайте массив цветов, как выше

Индивидуальные стили точек

Можно настроить для каждой точки (например, разный размер или цвет):

const data = {
  // ...общие данные
  datasets: [
    {
      // ...
      pointBackgroundColor: ['red', 'green', 'blue'], // Цвет каждой точки по очереди
      pointRadius: [5, 10, 15], // Размеры точек
    }
  ]
};

Chart.js по умолчанию назначит значения из массива последовательно точкам на линии.

Управление обновлением, динамика и реакт-состояние

Графики и состояние React

Вам наверняка понадобится строить графики с динамическими данными — например, их получает API или они меняются при действиях пользователя. Всё, что нужно — передавать data и options не как константы, а генерировать из состояния.

import React, { useState } from 'react';
import { Line } from 'react-chartjs-2';

function DynamicChart() {
  // Храним значения продаж в состоянии
  const [sales, setSales] = useState([100, 120, 80, 140, 160, 180]);
  
  // Обновляем данные, если надо (например, при клике)
  const handleUpdate = () => {
    setSales(sales.map(val => val + Math.round(Math.random() * 10 -
 5))); // Простое случайное обновление
  };
  
  const data = {
    labels: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн'],
    datasets: [{
      label: 'Продажи',
      data: sales,
      borderColor: 'blue'
    }]
  };
  
  return (
    <div>
      <Line data={data} />
      <button onClick={handleUpdate}>Обновить данные</button>
    </div>
  );
}

Chart.js автоматически обновляется при каждом изменении данных.

Работа с асинхронными данными

Ещё один пример — получение данных из API:

import { useEffect, useState } from 'react';
import { Bar } from 'react-chartjs-2';

function AsyncChart() {
  const [chartData, setChartData] = useState(null);

  useEffect(() => {
    // Симулируем загрузку
    setTimeout(() => {
      setChartData({
        labels: ['A', 'B', 'C'],
        datasets: [{
          label: 'API данные',
          data: [42, 55, 78],
          backgroundColor: 'purple'
        }]
      });
    }, 1000); // Задержка 1 сек
  }, []);
  
  // Пока данные не загружены — просто сообщаем об этом
  if (!chartData) return <div>Загрузка данных…</div>;

  return <Bar data={chartData} />;
}

Так вы можете легко интегрировать Chart.js с любыми источниками данных.

Кастомизация подписей, тултипов и легенды

Легенда

Включается и выключается через опции:

const options = {
  plugins: {
    legend: {
      display: true,
      position: 'top', // top, left, right, bottom
      labels: {
        color: 'gray', // Цвет текста легенды
        font: {
          size: 14,
        }
      }
    }
  }
};

Подписи осей

const options = {
  scales: {
    x: { title: { display: true, text: 'Время' } },
    y: { title: { display: true, text: 'Значение' } }
  }
};

Тултипы: Настройка подсказок при наведении

const options = {
  plugins: {
    tooltip: {
      enabled: true, // Включить тултипы
      callbacks: {
        label: function(context) {
          // Кастомная строка, которую видит пользователь
          return `Значение: ${context.parsed.y}`;
        }
      }
    }
  }
};

Раздел callbacks позволяет настраивать внешний вид tooltip вплоть до формата вывода.

Обработка кликов и событий пользователя

Chart.js поддерживает взаимодействие с пользователем через события.

Пример: обработать клик по элементу графика

import { Chart as ChartJS } from 'chart.js';
import { Line } from 'react-chartjs-2';

function ClickableChart({ data, options }) {
  const chartRef = React.useRef();

  const onClick = (event) => {
    const chart = chartRef.current;

    if (!chart) return;

    const points = chart.getElementsAtEventForMode(
      event.nativeEvent,
      'nearest',
      { intersect: true },
      true
    );
    if (points.length) {
      const firstPoint = points[0];
      const label = data.labels[firstPoint.index];
      const value = data.datasets[firstPoint.datasetIndex].data[firstPoint.index];
      alert(`Вы кликнули по: ${label} (значение: ${value})`);
    }
  };

  return (
    <Line data={data} options={options} ref={chartRef} onClick={onClick} />
  );
}

Смотрите, здесь используется реф, чтобы получить ссылку на ChartJS экземпляр.

Адаптация и рендеринг в разных размерах

Chart.js рендерит диаграммы в canvas, автоматически подгоняя размеры при установленной опции responsive: true (по умолчанию). Вы можете ограничивать размеры графика через контейнер:

<div style={{ maxWidth: 600, height: 400 }}>
  <Line data={data} options={options} />
</div>

Дополнительно, вы можете влиять на размеры текста, линий, точек, чтобы график хорошо смотрелся на мобильных устройствах.

Оптимизация производительности больших графиков

Для больших объемов данных:

  • Отключайте лишние плагины (легенды, тултипы), если не используете их.
  • Используйте опцию animation: false для отключения анимации на больших массивах данных.
  • Если требуется прокрутка, используйте виртуализацию данных (например, отображайте не все точки, а агрегированные значения).
const options = {
  animation: false, // Отключить анимацию
};

Типичные ошибки при работе с Chart.js в React

  • Не зарегистрировали компоненты/mixins (как в примере выше — обязательно ChartJS.register(...))
  • Путают работу с рефами и событиями
  • Пытаются напрямую модифицировать данные без реакт-состояния
  • Используют старые версии Chart.js или react-chartjs-2 (они не совместимы между собой)
  • Передают пустые или некорректные данные

Обратите внимание и вы избежите многих проблем!

Лучшие практики и советы

  • Храните данные графика в состоянии, чтобы автоматом реагировать на любые изменения
  • Используйте useRef только для особых ситуаций (например, обработки кликов на графике)
  • По возможности выносите опции в отдельные функции/константы для удобства поддержки
  • Не забывайте про мобильную адаптивность
  • Тщательно подбирайте цвета и подписывайте оси/легенду — это сильно улучшает читаемость

Заключение

Chart.js и React — отличная комбинация для визуализации данных. С помощью связки react-chartjs-2 и пушистого API самого Chart.js вы получите интерактивные, быстро обновляемые и красивые графики для любого применения. В этой статье вы увидели: как подключить библиотеку, разобраться в структуре данных, гибко настроить внешний вид, динамически обновлять данные и обрабатывать события. Такой подход применим для построения дашбордов, отчетов и любых интерфейсов работы с данными.

Chart.js позволяет визуализировать данные. Для создания сложных приложений требуется умение управлять состоянием и роутингом. Рассмотрите курс Основы React, React Router и Redux Toolkit для получения необходимых навыков. В первых 3 модулях уже доступно бесплатное содержание — начните погружаться в основы React уже сегодня.

Частозадаваемые технические вопросы по теме и ответы

1. Как скачать изображение или сохранить график в файл из React?

Вы можете получить ссылку на canvas и использовать стандартный метод toDataURL Chart.js: ```jsx const chartRef = React.useRef();

const downloadImage = () => { const chartInstance = chartRef.current; if (chartInstance) { const url = chartInstance.toBase64Image(); const link = document.createElement('a'); link.href = url; link.download = 'chart.png'; link.click(); } };

// Передайте ref в компонент Line/Bar и добавьте кнопку для вызова downloadImage ```

2. Как добавить аннотации (например, линии на определенных значениях)?

Chart.js требует отдельного плагина — chartjs-plugin-annotation: bash npm install chartjs-plugin-annotation Затем подключите и регистрируйте плагин. После этого в options.plugins.annotation описываются нужные элементы — линии, области и текстовые метки.

3. Как программно обновить график без необходимости перерисовывать весь компонент?

Chart.js в связке с React сам перерисовывает график при изменении пропсов data и options. Если нужно обновлять только часть данных (например, добавить новую точку), достаточно изменить данные в состоянии и передать их в компонент.

4. Как удалить или изменить подписи к отдельным точкам на графике?

Для скрытия подписей используйте массив labels, где на нужных индексов вместо текста указывайте пустую строку (“”). Для кастомных подписей можно реализовать кастомизацию через опцию plugins.tooltip.callbacks и plugins.legend.callbacks.

5. Как реализовать комбинированные графики (например, столбцы и линии на одном холсте)?

Chart.js поддерживает комбинированные графики. Просто в массиве datasets указывайте для каждой серии свой тип (например, type: 'line' или type: 'bar') и используйте компонент Chart из react-chartjs-2.

Стрелочка влевоПодключение Bootstrap к React-приложению

Постройте личный план изучения React до уровня Middle — бесплатно!

React — часть карты развития Frontend

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по React

Открыть базу знаний

Лучшие курсы по теме

изображение курса

React и Redux Toolkit

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажеры
Практика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий