Chord-диаграмма предназначена для визуализации взаимосвязей между группами данных в виде круговой структуры, где элементы представлены дугами окружности, а связи — изогнутыми лентами между ними. Основой такой диаграммы является матрица связей, где значения определяют силу или вес отношений между узлами.
Ключевые элементы chord-диаграммы:
Chord-диаграмма в D3 строится исключительно на основе квадратной матрицы:
[
[0, 10, 20],
[10, 0, 5],
[20, 5, 0]
]
Каждая строка и столбец соответствует категории, а значение отражает силу связи между ними. Диагональные элементы обычно равны нулю, поскольку не отображают самосвязи.
Смысл матрицы:
Функция d3.chord() преобразует матрицу в набор
геометрических данных для построения диаграммы.
Функция выполняет:
const chord = d3.chord()
.padAngle(0.05)
.sortSubgroups(d3.descending)
.sortChords(d3.descending);
Определяет расстояние между секторами:
Управляет порядком внутренних связей:
d3.descending — сортировка по убыванию весаd3.ascending — по возрастаниюОпределяет порядок отображения связей, влияя на перекрытие линий.
После применения chord(matrix) возвращается объект с
двумя основными частями:
Каждый элемент содержит:
Пример структуры:
{
startAngle: 0.2,
endAngle: 1.1,
value: 30,
index: 0
}
Каждая связь содержит:
{
source: { startAngle, endAngle, index, value },
target: { startAngle, endAngle, index, value }
}
Сектора окружности создаются через arc-генератор:
const arc = d3.arc()
.innerRadius(200)
.outerRadius(210);
Использование:
svg.append("g")
.selectAll("path")
.data(chords.groups)
.join("path")
.attr("d", arc);
Разница между ними формирует толщину сектора.
Функция d3.ribbon() отвечает за визуализацию связей
между секторами.
const ribbon = d3.ribbon()
.radius(200);
Каждый ribbon использует:
svg.append("g")
.selectAll("path")
.data(chords)
.join("path")
.attr("d", ribbon);
| Элемент | Назначение | Геометрия |
|---|---|---|
| arc | сектора | дуги окружности |
| ribbon | связи | кривые между секторами |
Цвета обычно назначаются на основе индекса группы:
const color = d3.scaleOrdinal(d3.schemeCategory10);
.attr("fill", d => color(d.index))
Для связей часто применяется цвет источника:
.attr("fill", d => color(d.source.index))
Chord-диаграмма использует радианные углы:
Перевод углов в экранные координаты происходит внутри arc и ribbon генераторов.
Матрица может быть:
В случае асимметрии:
d3.chord().sortGroups(d3.descending)
Позволяет упорядочить сектора по суммарному весу.
Используются:
Это снижает визуальный шум при большом количестве связей.
Для корректного отображения используется центрирование:
svg.attr("transform", "translate(width/2,height/2)");
Все элементы строятся относительно центра окружности.
const matrix = [
[0, 10, 30],
[10, 0, 5],
[30, 5, 0]
];
const chord = d3.chord()
.padAngle(0.05)
.sortSubgroups(d3.descending);
const chords = chord(matrix);
const arc = d3.arc()
.innerRadius(200)
.outerRadius(210);
const ribbon = d3.ribbon()
.radius(200);
const svg = d3.select("svg")
.attr("viewBox", [-300, -300, 600, 600]);
svg.append("g")
.selectAll("path")
.data(chords.groups)
.join("path")
.attr("d", arc);
svg.append("g")
.selectAll("path")
.data(chords)
.join("path")
.attr("d", ribbon);
Ribbon представляет собой кривую Безье, вычисляемую между двумя дугами окружности. Каждая связь интерполируется между:
Толщина ленты зависит от значения матрицы.
При больших различиях значений используется нормализация:
Это влияет на ширину ribbon, так как она пропорциональна весу связи.
Параметр padAngle влияет на:
Увеличение значения улучшает различимость, но снижает плотность информации.
Процесс построения состоит из двух этапов:
Разделение этих этапов позволяет: