Spec-Zone.ru › D3.js 3

Макет разбиения

Ссылка на API ▸ Макеты ▸ Иерархия ▸ Макет разбиения

Макет разбиения генерирует диаграммы смежности: пространственный вариант диаграммы «узел-связь» для древовидной структуры. Вместо рисования связи между родительским и дочерним узлами, узлы изображаются как сплошные области (дуги или прямоугольники), а их расположение относительно других узлов отображает их положение в иерархии. Размер узлов кодирует количественную размерность, которую сложно отобразить в диаграмме «узел-связь».

partition

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

d3.layout.partition()

Создаёт новый макет разбиения с настройками по умолчанию: порядок сортировки по умолчанию — по убыванию значения; по умолчанию функция доступа к значению предполагает, что каждый элемент входных данных — это объект с числовым атрибутом значения; по умолчанию функция доступа к дочерним элементам предполагает, что каждый элемент входных данных — это объект с массивом дочерних элементов; размер по умолчанию — 1×1.

partition(root)
partition.nodes(root)

Выполняет макет разбиения, возвращая массив узлов, связанных со заданным узлом root. Макет разбиения является частью семейства макетов иерархий D3. Эти макеты следуют одной и той же базовой структуре: входным аргументом макета является корневой узел иерархии, а выходным значением является массив, представляющий вычисленные позиции всех узлов. Для каждого узла заполняются несколько атрибутов:

  • parent — родительский узел или null для корневого узла.
  • children — массив дочерних узлов или null для листовых узлов.
  • value — значение узла, возвращаемое функцией доступа к значению.
  • depth — глубина узла, начиная с 0 для корневого узла.
  • x — минимальная координата x позиции узла.
  • y — минимальная координата y позиции узла.
  • dx — протяжённость по оси x позиции узла.
  • dy — протяжённость по оси y позиции узла.

Хотя макет имеет размер по x и y, это представляет произвольную систему координат; например, вы можете рассматривать x как угол, а y — как радиус, чтобы получить радиальный, а не декартов макет. В декартовой ориентации x, y, dx и dy соответствуют атрибутам «x», «y», «ширина» и «высота» элемента SVG rect. В радиальной ориентации они могут быть использованы для вычисления innerRadius, startAngle, outerRadius и endAngle генератора arc. Декартовая ориентация может называться «деревом-ледяной свечи», а радиальная — «солнечным затмением».

partition.links(nodes)

Принимая заданный массив nodes, например, возвращённый функцией nodes, возвращает массив объектов, представляющих связи от родительского к дочернему узлу для каждого узла. Листовые узлы не имеют связей. Каждая связь — это объект с двумя атрибутами:

  • source — родительский узел (как описано выше).
  • target — дочерний узел.

Этот метод полезен для получения набора описаний связей, пригодных для отображения, часто в сочетании с генератором формы diagonal. Например:

svg.selectAll("path")
    .data(partition.links(nodes))
  .enter().append("path")
    .attr("d", d3.svg.diagonal());
partition.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, то узел считается листовым, и обход иерархии завершается. В противном случае функция должна вернуть массив элементов данных, представляющих дочерние узлы.

partition.sort([comparator])

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

function comparator(a, b) {
  return b.value - a.value;
}

Функция сравнения вызывается для пар узлов, получая входные данные для каждого узла. Сравнение по null отключает сортировку и использует порядок обхода дерева. Функции сравнения также могут быть реализованы с помощью d3.ascending или d3.descending.

partition.value([value])

Если value указан, задаёт функцию доступа к значению до указанной функции. Если value не указан, возвращает текущую функцию доступа к значению, которая предполагает, что входные данные — это объект с числовым атрибутом значения:

function value(d) {
  return d.value;
}

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

partition.size([size])

Если size указан, устанавливает доступный размер макета до указанного двумерного массива чисел, представляющих x и y.

var width = 1800, height = 2000;
var partition = d3.layout.partition()
    .size([width, height])
    .value(function(d) { return d.size; });

Если size не указан, возвращается текущий размер, который по умолчанию равен 1×1. Обратите внимание, что если размер не задан явно, т.е. по умолчанию 1×1, вычисленные координаты каждого элемента будут нормализованы, т.е. каждая координата будет < 1, а сумма всех координат будет равна 1. Следовательно, на пользовательском интерфейсе ничего не будет отображено (так как 1×1 слишком мало, чтобы что-то увидеть). Хорошим способом использования такой ситуации является применение линейного масштабирования диапазона. Результат отображения будет таким же, как в случае явного задания размера диаграммы, но вы получите более гибкое решение для дальнейших реализаций:

// first, declare scaling for X and Y axis
 var width = 1800, height = 2000,
 x = d3.scale.linear().range([0, width]),
 y = d3.scale.linear().range([0, height]);

// then apply the scaling for each calculated coordinate
svg.selectAll("rect").data(nodes)
            .enter().append("svg:rect")
            .attr("x", function(d) { return x(d.x);})
            .attr("y", function(d) { return y(d.y);})
            .attr("width", function(d) {  return  x(d.dx);})
            .attr("height", function(d) { return y(d.dy); });

© 2010–2016 Michael Bostock
Licensed under the BSD License.
https://github.com/d3/d3-3.x-api-reference/blob/master/Partition-Layout.md

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API