我有一个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,或者返回默认值为其他值返回的值。
答案 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的是值(包布局是基于它们计算的),而不是半径(这实际上是广义上说是布局计算的结果)。 :)
希望这有帮助。