Макет кластера
Ссылка на API ▸ Макеты ▸ Иерархия ▸ Макет кластера
Макет кластера создаёт дендрограммы: диаграммы «узел-связь», которые размещают листья дерева на одинаковой глубине. Например, макет кластера можно использовать для организации программных классов в иерархии пакетов:

Как и другие классы в D3, макеты следуют схеме цепочки методов, где методы-сеттеры возвращают сам макет, что позволяет вызывать несколько сеттеров в одном компактном операторе.
d3.layout.cluster()
Создаёт новый макет кластера с настройками по умолчанию: порядок сортировки по умолчанию — null; функция доступа к детям по умолчанию предполагает, что каждый элемент входных данных — это объект с массивом children; функция разделения по умолчанию использует ширину одного узла для братьев и сестёр и две ширины узлов для небратьев и несестёр; размер по умолчанию — 1×1.
cluster(корень)
cluster.nodes(корень)
Выполняет макет кластера, возвращая массив узлов, связанных с указанным узлом корень. Макет кластера входит в семейство макетов иерархических макетов D3. Эти макеты следуют той же базовой структуре: входным аргументом макета является узел корень иерархии, а возвращаемым значением — массив, представляющий вычисленные позиции всех узлов. На каждом узле заполняется несколько атрибутов:
- parent — родительский узел или null для корня.
- children — массив дочерних узлов или null для листьев.
- depth — глубина узла, начиная с 0 для корня.
- x — вычисленная координата x позиции узла.
- y — вычисленная координата y позиции узла.
Хотя макет имеет размер по x и y, это представляет собой произвольную систему координат; например, вы можете рассматривать x как радиус, а y как угол, чтобы получить радиальный, а не декартов макет.
cluster.links(узлы)
Принимая на вход массив узлов, такой, как тот, что возвращается методом nodes, возвращает массив объектов, представляющих связи от родителя к ребёнку для каждого узла. У листьев не будет никаких связей. Каждый элемент массива — это объект с двумя атрибутами:
- source — родительский узел (как описано выше).
- target — дочерний узел.
Этот метод полезен для получения набора описаний связей, пригодных для отображения, часто в сочетании с генератором формы диагональ. Например:
svg.selectAll("path")
.data(cluster.links(nodes))
.enter().append("path")
.attr("d", d3.svg.diagonal()); cluster.children([children])
Если children указано, устанавливает указанную функцию доступа к детям. Если children не указано, возвращает текущую функцию доступа к детям, которая по умолчанию предполагает, что входные данные — это объект с массивом children:
function children(d) {
return d.children;
} Часто удобно загружать иерархию узлов с помощью d3.json и представлять входную иерархию в виде вложенного JSON объекта. Например:
{
"name": "flare",
"children": [
{
"name": "analytics",
"children": [
{
"name": "cluster",
"children": [
{"name": "AgglomerativeCluster", "size": 3938},
{"name": "CommunityStructure", "size": 3812},
{"name": "MergeEdge", "size": 743}
]
},
{
"name": "graph",
"children": [
{"name": "BetweennessCentrality", "size": 3534},
{"name": "LinkDistance", "size": 5731}
]
}
]
}
]
} Функция доступа к детям сначала вызывается для корневого узла в иерархии. Если функция возвращает null, то узел считается листом, и обход макета прекращается. В противном случае функция должна вернуть массив элементов данных, представляющих дочерние узлы.
cluster.sort([компаратор])
Если компаратор указан, устанавливает порядок сортировки узлов-братьев и сестёр для макета, используя указанную функцию компаратора. Если компаратор не указан, возвращает текущий порядок сортировки групп, который по умолчанию равен null (нет сортировки). Функция компаратора вызывается для пар узлов, получая входные данные для каждого узла. Значение по умолчанию компаратора — null, что отключает сортировку и использует порядок обхода дерева. Например, для сортировки узлов-братьев и сестёр в порядке убывания по строковому атрибуту имени связанных входных данных, скажем:
function comparator(a, b) {
return d3.ascending(a.name, b.name);
} См. d3.ascending или d3.descending для получения подробной информации.
cluster.separation([separation])
Если separation указано, использует указанную функцию для вычисления разделения между соседними узлами. Если separation не указано, возвращает текущую функцию разделения, которая по умолчанию равна:
function separation(a, b) {
return a.parent == b.parent ? 1 : 2;
} Вариант, более подходящий для радиальных макетов, уменьшает разрыв разделения пропорционально радиусу:
function separation(a, b) {
return (a.parent == b.parent ? 1 : 2) / a.depth;
} Функция разделения получает два соседних узла a и b и должна вернуть желаемое разделение между узлами. Узлы обычно являются братьями и сёстрами, хотя узлы также могут быть двоюродными братьями и сёстрами (или даже более дальними родственниками), если макет решает расположить такие узлы рядом.
cluster.size([размер])
Если размер указан, устанавливает доступный размер макета на заданный массив из двух чисел, представляющий x и y. Если размер не указан, возвращает текущий размер, который по умолчанию равен 1×1, или null, если используется nodeSize. Хотя макет имеет размер по x и y, это представляет собой произвольную систему координат. Например, для создания радиального макета, где ширина дерева (x) измеряется в градусах, а глубина дерева (y) — радиусом r в пикселях, скажем [360, r].
cluster.nodeSize([nodeSize])
Если nodeSize указан, устанавливает фиксированный размер каждого узла как массив из двух чисел, представляющий x и y. Если nodeSize не указан, возвращает текущий размер узла, который по умолчанию равен null, что означает, что макет имеет фиксированный общий размер, который можно получить с помощью size.
cluster.value([значение])
Если значение указано, устанавливает функцию доступа к значению до указанной функции. Если значение не указано, возвращает текущую функцию доступа к значению, которая по умолчанию равна null, что означает, что атрибут значения не вычисляется. При указании функция доступа к значению вызывается для каждого элемента входных данных и должна возвращать число, представляющее числовое значение узла. Это значение не влияет на макет кластера, но представляет собой общую функциональность, предоставляемую иерархическими макетами.
© 2010–2016 Michael Bostock
Licensed under the BSD License.
https://github.com/d3/d3-3.x-api-reference/blob/master/Cluster-Layout.md