d3.lineRadial() представляет собой генератор SVG-пути в библиотеке D3.js, предназначенный для построения линий в полярной системе координат. В отличие от классического d3.line(), работающего в декартовой системе (x, y), данный генератор интерпретирует входные данные как пары «угол — радиус» и преобразует их в координаты (x, y) внутри SVG через полярное преобразование.
Основой работы radial-линий является переход от привычной двумерной системы координат к полярной:
Преобразование выполняется по формулам:
x = r · cos(θ) y = r · sin(θ)
В контексте SVG координатная система имеет особенности: ось Y направлена вниз, а нулевой угол обычно начинается с направления на 12 часов (вверх), если не изменено поведение через параметры.
Именно эта геометрия позволяет строить круговые диаграммы, радиальные графики и визуализации, где важна циклическая структура данных.
Классический генератор линий d3.line():
Генератор d3.lineRadial():
Ключевое отличие заключается не в логике соединения точек (она одинаковая), а в системе интерпретации входных значений.
Генератор создаётся следующим образом:
const radialLine = d3.lineRadial();
Основные методы конфигурации:
Определяет, как извлекается угол из данных:
radialLine.angle(d => d.angle);
Угол задаётся в радианах, что соответствует математической стандартной форме. Часто используется преобразование из градусов:
const toRadians = deg => (deg * Math.PI) / 180;
Определяет радиальную координату:
radialLine.radius(d => d.radius);
Радиус может быть как числовым значением, так и результатом шкалы.
Позволяет контролировать пропуски данных:
radialLine.defined(d => d.value !== null);
Если функция возвращает false, сегменты линии разрываются.
Управляет интерполяцией между точками:
radialLine.curve(d3.curveLinear);
Поддерживаются различные типы сглаживания: линейные, сплайновые, ступенчатые и другие кривые D3.
Обычно данные для radial-линий имеют структуру:
const data = [
{ angle: 0, radius: 10 },
{ angle: Math.PI / 4, radius: 20 },
{ angle: Math.PI / 2, radius: 35 }
];
Генератор последовательно:
Результат — строка d, пригодная для элемента
<path>.
const radialLine = d3.lineRadial()
.angle(d => d.angle)
.radius(d => d.radius);
const path = radialLine(data);
SVG:
<path d="{path}" fill="none" stroke="black"/>
Важно, что центр координат по умолчанию находится в (0, 0), поэтому обычно применяется трансформация:
<g transform="translate(width/2, height/2)">
В реальных задачах данные редко уже находятся в радианах и готовом радиусе. Обычно применяются шкалы:
const angleScale = d3.scaleLinear()
.domain([0, 100])
.range([0, 2 * Math.PI]);
const radiusScale = d3.scaleLinear()
.domain([0, 1])
.range([0, 150]);
Использование:
const radialLine = d3.lineRadial()
.angle(d => angleScale(d.x))
.radius(d => radiusScale(d.y));
Такой подход позволяет строить визуализации из произвольных данных, сохраняя контроль над геометрией.
Radial-линии поддерживают те же кривые, что и обычные линии D3, но с учётом полярного пространства.
Пример сглаживания:
d3.lineRadial()
.curve(d3.curveCardinal)
Сглаживание особенно важно в круговых графиках, где резкие углы визуально воспринимаются сложнее.
Типы кривых влияют на:
Radial-линии могут использоваться как для открытых, так и для замкнутых фигур. Замыкание обычно выполняется вручную:
data.push(data[0]);
Это позволяет построить замкнутые радиальные полигоны, часто используемые в:
Так как координаты генератора централизованы вокруг (0, 0), стандартная практика — смещение группы:
<g transform="translate(200, 200)">
<path d="..." />
</g>
Это позволяет считать центр диаграммы базовой точкой отсчёта.
При необходимости можно дополнительно поворачивать всю систему:
<g transform="translate(200,200) rotate(90)">
Несмотря на схожесть в области применения, d3.arc() и d3.lineRadial() решают разные задачи:
Таким образом:
При работе с radial-линиями важно учитывать:
Пример нормализации угла:
const normalize = a => (a + 2 * Math.PI) % (2 * Math.PI);
Radial-линии часто используются в:
Типичная структура визуализации включает:
При построении сложных систем radial-line часто комбинируется с:
Это позволяет создавать многослойные графики, где линия отражает динамику, а фон — структуру категорий.
При использовании d3.lineRadial в больших наборах данных важны следующие моменты:
Также важно учитывать, что SVG path может становиться очень длинным при высокой детализации, что влияет на рендеринг в браузере.