Можно ли использовать макет круга в d3.js с фиксированными размерами круга?

Этот пример макета кружка (http://bl.ocks.org/4063269) идеально подходит для проект, над которым я работаю, однако он измеряет все круги относительно друг друга:

введите здесь описание изображения

Есть ли простой способ указать фиксированные радиусы для каждого круга?

Я просмотрел исходный код, примеры, google и stackoverflow и не нашел ничего полезного.

Для меня важен точный размер кругов.


person user2058412    schedule 10.02.2013    source источник
comment
user2058412, не могли бы вы взглянуть на мой ответ? Это полезно для вас?   -  person VividD    schedule 26.06.2014


Ответы (2)


Это возможно, и это просто. Первый ответ точен, но я считаю, что мой проще и понятнее, поэтому я его тоже прилагаю.

Взгляните на этот пример: jsfiddle

Когда вы нажмете кнопку «Константа», вы увидите что-то вроде этого:

введите здесь описание изображения

Ключевая строка кода такова:

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

Это сделает радиусы кругов постоянными независимо от данных. 100 может быть любой константой, конечно. Вы можете применить эту строку при инициализации пакета кругов (скорее всего, это будет ваш случай) или при повторной инициализации (как в моем примере).

Надеюсь это поможет.

person VividD    schedule 26.06.2014

Если вы будете следовать коду в приведенном вами примере, размер элементов <circle> определяется здесь:

node.append("circle")
  .attr("r", function(d) { return d.r; })
// ...

Чтобы исправить размер кругов, скажем, 50, вы можете сделать это:

node.append("circle")
  .attr("r", function(d) { return 50; })
// ...

Обновлять

Однако это нарушит макет, как указано в комментарии. Чтобы исправить это, можно указать один и тот же value для каждого узла:

// Returns a flattened hierarchy containing all leaf nodes under the root.
function classes(root) {
  var classes = [];

  function recurse(name, node) {
    if (node.children) node.children.forEach(function(child) { recurse(node.name, child); });
    else classes.push({packageName: name, className: node.name, value: node.size});
  }

  recurse(null, root);
  return {children: classes};
}

to:

// Returns a flattened hierarchy containing all leaf nodes under the root.
function classes(root) {
  var classes = [];

  function recurse(name, node) {
    if (node.children) node.children.forEach(function(child) { recurse(node.name, child); });
    else classes.push({packageName: name, className: node.name, value: 1});
  }

  recurse(null, root);
  return {children: classes};
}
person musically_ut    schedule 10.02.2013
comment
Спасибо за ответ! На самом деле я пробовал это, но это нарушает макет: cl.ly/image/2M3o1T2n2k1V . Это должно выглядеть так: cl.ly/image/1U1b3v3m152W - person user2058412; 12.02.2013
comment
Обновил ответ с возможным исправлением. - person musically_ut; 12.02.2013