我一直在使用D3中内置的力导向算法制作网络拓扑可视化图。一切都很顺利,但是有一个重要的细节问题困扰着我... 我似乎无法找到一种适用于节点数量不同的图形的理想布局方式。所谓理想布局,就是节点之间距离合适(没有重叠),并且节点会在合理的地方聚集。我一直在尝试通过调整力布局的“电荷”和“引力”属性来实现这一点,但是不管我尝试什么,似乎总是只适用于某一种情况(如较多节点的情况),而对于其他情况(如节点较少),则无法达到理想效果。例如,如果我已经针对大型图形使布局工作正常,那么当我使用相同的电荷/引力公式查看小型图形时,我会发现有几个节点与其他节点相差甚远。这是我基于另外一个SO问题的公式示例:post:
这适用于具有14个节点的图表,但如果我尝试使用5个节点的图表,其中一些节点完全偏离了屏幕。请注意,在计算“k”时使用的宽度/高度在这两种情况下都没有改变。现在也许我不应该基于图形可见区域的宽度/高度来设置这些属性。老实说,这不是必需的。我不需要图表在视口中呈现和适合。我只需要图表能够合理地布局,因此如果一些内容在可见区域之外,特别是在大型图表中,那么这也没关系。我还尝试了以下方法,并取得了一些成功,但我仍然发现对于小型图表,节点离其他部分的距离过远:
var k = Math.sqrt(json.nodes.length / (dim.w * dim.h));
var charge = -10 / k;
var gravity = 100 * k;
这适用于具有14个节点的图表,但如果我尝试使用5个节点的图表,其中一些节点完全偏离了屏幕。请注意,在计算“k”时使用的宽度/高度在这两种情况下都没有改变。现在也许我不应该基于图形可见区域的宽度/高度来设置这些属性。老实说,这不是必需的。我不需要图表在视口中呈现和适合。我只需要图表能够合理地布局,因此如果一些内容在可见区域之外,特别是在大型图表中,那么这也没关系。我还尝试了以下方法,并取得了一些成功,但我仍然发现对于小型图表,节点离其他部分的距离过远:
var charge = -1 * Math.pow(json.nodes.length, 3);
var gravity = 1 / json.nodes.length;
有没有人能够帮我解决这个问题?非常感激,因为我目前感到有些困惑。
linkDistance
属性,甚至添加“幻影”链接,即那些不被绘制但会影响节点位置的链接。 - Lars Kotthoff