Круговая диаграмма (pie)

Круговая диаграмма (pie) в Chart.js предназначена для визуального отображения долевого распределения данных, где каждая секция представляет отдельную категорию, а её размер пропорционален значению относительно общей суммы. Такой тип графика особенно эффективен в случаях, когда необходимо показать структуру целого и сравнить доли между собой без необходимости точного числового анализа.

В основе построения круговой диаграммы лежит один набор данных, в котором каждое значение преобразуется в сектор круга. Сумма всех значений автоматически нормализуется до 360 градусов. Это делает диаграмму интуитивно понятной: чем больше значение, тем больше угол сектора.

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

const config = {
  type: 'pie',
  data: {
    labels: ['Красный', 'Синий', 'Жёлтый'],
    datasets: [{
      label: 'Распределение',
      data: [300, 150, 100],
      backgroundColor: [
        'rgb(255, 99, 132)',
        'rgb(54, 162, 235)',
        'rgb(255, 205, 86)'
      ],
      borderColor: [
        'rgb(255, 255, 255)'
      ],
      borderWidth: 2
    }]
  }
};

В этом примере ключевыми элементами являются:

labels — массив подписей, определяющих категории данных. datasets — набор данных, содержащий значения и визуальные параметры отображения.

Каждое значение из data соответствует одной метке из labels по индексу.

Инициализация диаграммы

После определения конфигурации создаётся экземпляр графика через объект Canvas:

const ctx = document.getElementById('myChart');

new Chart(ctx, config);

Chart.js автоматически привязывает график к выбранному элементу <canvas> и выполняет отрисовку на основе переданных данных.

Визуальные параметры секторов

Каждый сектор круговой диаграммы может быть настроен через набор визуальных свойств:

  • backgroundColor — цвет заливки сектора
  • borderColor — цвет границы
  • borderWidth — толщина границы
  • hoverOffset — смещение сектора при наведении

Пример расширенной настройки:

datasets: [{
  data: [120, 80, 200],
  backgroundColor: ['#ff6384', '#36a2eb', '#ffcd56'],
  borderColor: '#ffffff',
  borderWidth: 3,
  hoverOffset: 10
}]

Параметр hoverOffset особенно важен для повышения интерактивности, так как визуально выделяет активный сектор.

Работа с процентным распределением

Круговая диаграмма не требует предварительного преобразования данных в проценты. Chart.js выполняет расчёт автоматически. Однако для отображения процентов в подсказках или подписях используется кастомизация tooltip.

Пример настройки отображения процентов:

options: {
  plugins: {
    tooltip: {
      callbacks: {
        label: function(context) {
          const dataset = context.dataset.data;
          const total = dataset.reduce((a, b) => a + b, 0);
          const value = dataset[context.dataIndex];
          const percent = ((value / total) * 100).toFixed(2);
          return `${context.label}: ${percent}%`;
        }
      }
    }
  }
}

Здесь вычисляется сумма всех значений и определяется доля каждого элемента.

Легенда и её настройка

Легенда в круговой диаграмме отображает соответствие цветов и категорий. Управление осуществляется через plugins.legend.

options: {
  plugins: {
    legend: {
      display: true,
      position: 'right',
      labels: {
        font: {
          size: 14
        },
        padding: 20
      }
    }
  }
}

Возможные позиции легенды:

  • top
  • bottom
  • left
  • right

Легенда может быть отключена полностью при установке display: false.

Интерактивность и события

Chart.js поддерживает взаимодействие с элементами диаграммы. Наведение и клик по секторам позволяют извлекать данные.

Пример обработки клика:

const chart = new Chart(ctx, config);

ctx.oncl ick = function(evt) {
  const points = chart.getElementsAtEventForMode(
    evt,
    'nearest',
    { intersect: true },
    true
  );

  if (points.length) {
    const firstPoint = points[0];
    const label = chart.data.labels[firstPoint.index];
    const value = chart.data.datasets[0].data[firstPoint.index];

    console.log(label, value);
  }
};

Механизм взаимодействия строится на определении ближайшего элемента относительно координат курсора.

Адаптивность и масштабирование

По умолчанию круговая диаграмма является адаптивной. Она подстраивается под размеры контейнера <canvas>. Управление этим поведением осуществляется через:

options: {
  responsive: true,
  maintainAspectRatio: false
}

При отключении maintainAspectRatio график заполняет доступное пространство, игнорируя исходное соотношение сторон.

Использование с внешними данными

Часто данные для круговой диаграммы поступают из API. В таком случае структура конфигурации формируется динамически:

fetch('/api/data')
  .then(response => response.json())
  .then(data => {
    new Chart(ctx, {
      type: 'pie',
      data: {
        labels: data.labels,
        datasets: [{
          data: data.values,
          backgroundColor: data.colors
        }]
      }
    });
  });

Динамическая генерация позволяет использовать диаграмму в аналитических панелях и системах мониторинга.

Обновление данных

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

chart.data.datasets[0].data = [200, 100, 50];
chart.update();

Метод update() пересчитывает и перерисовывает диаграмму с новыми значениями.

Отличия pie и doughnut

Круговая диаграмма имеет близкий аналог — doughnut. Основное различие заключается в наличии центрального отверстия.

type: 'doughnut'

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

Цветовые схемы и восприятие данных

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

Пример равномерного распределения оттенков:

backgroundColor: [
  '#4e79a7',
  '#f28e2b',
  '#e15759',
  '#76b7b2',
  '#59a14f'
]

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

Ограничения круговой диаграммы

При увеличении количества категорий визуальная читаемость снижается. Секторы становятся слишком узкими, а подписи — перегруженными. В таких случаях используется группировка данных или переход к столбчатым диаграммам.

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

Форматирование подсказок

Tooltip остаётся основным способом представления точных значений. Помимо процентов, часто добавляются единицы измерения:

callbacks: {
  label: function(context) {
    return `${context.label}: ${context.raw} шт.`;
  }
}

Комбинирование абсолютных и относительных значений повышает информативность визуализации.

Стилизация через глобальные настройки

Chart.js позволяет задавать глобальные параметры, влияющие на все диаграммы:

Chart.defaults.font.family = 'Arial';
Chart.defaults.font.size = 12;
Chart.defaults.color = '#333';

Эти настройки упрощают унификацию визуального стиля в проекте.

Масштабируемые сценарии применения

Круговая диаграмма применяется в интерфейсах аналитики, отчётных панелях, системах мониторинга и визуализации распределений. Она особенно эффективна при ограниченном числе категорий и необходимости быстрого восприятия структуры данных без глубокого анализа числовых значений.