Внутренний радиус и кольцевые диаграммы (Donut)

В библиотеке Nivo круговые диаграммы реализуются через компонент PieChart и его производные, включая вариант Donut. Центральным параметром, определяющим переход от классической круговой диаграммы к кольцевой, выступает внутренний радиус (innerRadius).

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


Параметр innerRadius и его роль

Параметр innerRadius задаётся как число в диапазоне от 0 до 1 и определяет отношение внутреннего радиуса к внешнему.

  • innerRadius: 0 — классическая круговая диаграмма
  • innerRadius: 0.5 — половина радиуса остаётся пустой, формируется толстое кольцо
  • innerRadius: 0.8 — тонкое кольцо с выраженным центральным пространством
  • innerRadius: 0.9 — минимальная толщина сегментов

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


Математическая модель кольцевой диаграммы

Пусть внешний радиус равен ( R ), тогда внутренний радиус определяется как:

r = kR

где:

  • ( r ) — внутренний радиус
  • ( R ) — внешний радиус диаграммы
  • ( k ) — коэффициент innerRadius

Площадь кольцевого сегмента определяется разностью площадей двух окружностей:

S = R^2 - r^2

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


Базовая структура Donut Chart в Nivo

В библиотеке Nivo кольцевая диаграмма реализуется через компонент ResponsivePie. Основное отличие от обычной Pie Chart заключается в передаче параметра innerRadius.

import { ResponsivePie } from '@nivo/pie'

const data = [
    { id: 'JavaScript', value: 45 },
    { id: 'Python', value: 25 },
    { id: 'Java', value: 15 },
    { id: 'C#', value: 10 },
    { id: 'Go', value: 5 }
]

const DonutChart = () => (
    <ResponsivePie
        data={data}
        margin={{ top: 40, right: 80, bottom: 80, left: 80 }}
        innerRadius={0.6}
        padAngle={1}
        cornerRadius={2}
        activeOuterRadiusOffset={8}
        borderWidth={1}
        borderColor={{ from: 'color', modifiers: [['darker', 0.2]] }}
        enableArcLinkLabels={true}
        arcLinkLabelsSkipAngle={10}
        arcLinkLabelsTextColor="#333333"
        arcLabelsSkipAngle={10}
        arcLabelsTextColor="#ffffff"
    />
)

Геометрия сегментов при увеличении внутреннего радиуса

При изменении innerRadius меняется форма каждого сегмента:

  • при малом значении сегменты широкие и сходятся в центре
  • при увеличении значения сегменты становятся более вытянутыми
  • при значениях выше 0.7 визуальная масса переносится к внешнему краю

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


Использование центральной области

Пустое пространство в центре Donut Chart используется как функциональная зона интерфейса. В Nivo это реализуется через наложение дополнительных элементов поверх SVG-контейнера.

Пример центрального текста

const CenteredMetric = ({ dataWithArc }) => {
    let total = dataWithArc.reduce((acc, datum) => acc + datum.value, 0)

    return (
        <div style={{
            position: 'absolute',
            top: '50%',
            left: '50%',
            transform: 'translate(-50%, -50%)',
            textAlign: 'center'
        }}>
            <div style={{ fontSize: 24, fontWeight: 'bold' }}>
                {total}
            </div>
            <div style={{ fontSize: 12, color: '#888' }}>
                Total
            </div>
        </div>
    )
}

Такой подход позволяет использовать Donut Chart как комбинированный визуальный элемент: график + индикатор состояния.


Анимация сегментов и влияние innerRadius

В Nivo встроена система анимаций, которая реагирует на изменение данных и параметров компонента. При увеличении innerRadius изменяется траектория анимации:

  • сегменты «раскрываются» от внутренней окружности
  • при обновлении данных происходит перерасчёт дуг
  • переходы выполняются через интерполяцию углов и радиусов

Анимация основана на параметрическом описании дуги:

x = r (),y = r ()

При изменении внутреннего радиуса изменяется диапазон значений ( r ), что влияет на форму интерполяции.


Влияние innerRadius на читаемость данных

Кольцевая форма изменяет визуальную иерархию:

  • уменьшается акцент на центр как точку сравнения
  • увеличивается значение длины дуги как основного метрики восприятия
  • возрастает роль цветового кодирования

При больших наборах данных (более 6–8 категорий) кольцевая диаграмма часто оказывается более читаемой, чем классическая круговая, за счёт увеличения свободного пространства внутри и уменьшения визуальной перегруженности центра.


Настройка толщины кольца

Толщина кольца определяется разницей между внешним и внутренним радиусом. В Nivo внешний радиус фиксируется контейнером, а внутренний регулируется параметром innerRadius.

Практические значения:

  • 0.3–0.4 — толстое кольцо, подходит для небольшого числа категорий
  • 0.5–0.7 — универсальный диапазон
  • 0.75–0.85 — тонкое кольцо, используется для дашбордов и KPI-индикаторов

Чем тоньше кольцо, тем выше визуальная зависимость от цветовой дифференциации.


Комбинация с paddingAngle и cornerRadius

Эффект кольцевой диаграммы усиливается при использовании дополнительных параметров:

  • padAngle — добавляет промежутки между сегментами
  • cornerRadius — скругляет края сегментов
<ResponsivePie
    data={data}
    innerRadius={0.65}
    padAngle={2}
    cornerRadius={4}
/>

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


Слои визуализации и структура SVG

Каждая кольцевая диаграмма в Nivo строится как набор SVG-слоёв:

  1. arcs (сегменты)
  2. arc link labels (линии подписей)
  3. labels (внутренние подписи)
  4. legends
  5. overlays (включая кастомный центр)

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


Взаимодействие с hover-состояниями

При наведении на сегмент используется параметр activeOuterRadiusOffset. Он увеличивает внешний радиус активного сегмента, сохраняя внутренний неизменным.

Это создаёт эффект «выталкивания» сегмента из кольца, усиливая визуальную обратную связь. Геометрически это выглядит как увеличение углового сектора без изменения центрального отверстия.


Практическое влияние на дизайн интерфейсов

Кольцевая диаграмма с заданным innerRadius часто используется в интерфейсах, где требуется:

  • отображение долей с дополнительной метрикой в центре
  • компактное размещение визуализации в карточках
  • интеграция в дашборды с KPI
  • комбинирование графика и текстового индикатора

При этом классическая круговая диаграмма применяется преимущественно для статических отчётов, тогда как Donut Chart становится частью интерактивных систем визуализации.


Ограничения при использовании высокого innerRadius

При значениях innerRadius выше 0.8 возникают особенности восприятия:

  • сегменты становятся слишком узкими
  • различия между малыми значениями теряют визуальную выразительность
  • подписи могут перекрывать друг друга при большом количестве категорий

Для компенсации используются:

  • отключение arcLinkLabels
  • увеличение радиуса контейнера
  • перенос подписей в легенду

Связь innerRadius с адаптивностью

Компонент ResponsivePie автоматически пересчитывает геометрию при изменении размеров контейнера. InnerRadius при этом остаётся относительным коэффициентом, что позволяет сохранять пропорции кольца на разных разрешениях экрана.

В адаптивных интерфейсах это свойство обеспечивает стабильность визуальной структуры без необходимости пересчёта абсолютных значений радиуса.