圆形包布局最小半径

时间:2014-02-11 09:47:17

标签: javascript d3.js circle-pack

我有一个Pack布局,其中一些实体的值为零。 我正试图找到一种方法为那些设置默认半径。根据文档,我希望我能写出像这样的东西

pack.radius(function(r){
   return r==0 ? MIN_RADIUS : oldRadiusFunction(r);
});

但到目前为止,在确定如何访问“oldRadiusFunction”方面还没有取得任何成功。

我最接近解决这个问题的方法是:

pack.radius(function(r){
  return r== 0 ? MIN_RADIUS : p.radius(null)(r);
});
var p = this.pack;

...以便从函数中访问this.pack。这似乎最初效果很好,但是当我开始更新图表时开始产生奇怪的结果。

无论如何,非常感谢任何帮助,非常感谢您的关注和投入!

编辑:这是文档说的内容

  

pack.radius([半径])

     

如果指定了radius,则设置radius函数以计算每个节点的半径。如果radius为null,则默认情况下,半径由节点值自动确定,缩放以适合布局大小。如果未指定radius,则返回当前radius函数,默认为null。对于均匀圆周大小,半径也可以指定为常数。

我的目标(可能有点天真)是传递一个函数,该函数在作为参数传递0时返回MIN_RADIUS,或者返回默认值为其他值返回的值。

1 个答案:

答案 0 :(得分:0)

如果您将以下代码放在circle pack初始化中:

.value(function(d){return Math.max(0.01, d.size);});

你的问题会消失。您可能需要调整0.01以获得正确的(期望的)最小半径,或者添加更多代码来处理半径,但如果数据中的大小为0,则必须使用上面的代码,否则,圆形包将给出非常有趣和不正确的布局......(我通过经验学到了很多东西)

以下是我为其他场合制作的jsfiddle,但它也有大小为0的元素,并说明上面的代码有效。

这是因为在之前应用布局在

中进一步计算了几行
.data(pack.nodes({blocks:data}))

这也解释了为什么您的解决方案不起作用(在布局计算后应用)。此外,必须为非0的是值(包布局是基于它们计算的),而不是半径(这实际上是广义上说是布局计算的结果)。 :)

希望这有帮助。