我一直在使用 D3 中内置的力导向算法进行网络拓扑可视化。一切都运行良好,但在一个重要细节上遇到了麻烦......对于具有不同数量节点的图形,我似乎无法以理想的方式布局图形。理想情况下,我的意思是节点与每个节点之间的间隔很好(没有重叠),节点集群在任何有意义的地方。我一直在尝试通过调整力布局的“电荷”和“重力”属性来做到这一点,但无论我尝试什么,它似乎总是适用于一种情况(即大量节点),但不是对于另一种情况(即少量节点)。例如,如果我的布局适用于大图,那么当我使用相同的电荷/重力公式查看小图时,我有一些节点与其他节点相距甚远。这是我根据另一个 SO 问题使用的公式示例帖子:
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;
有人可以帮我解决这个问题吗?将不胜感激,因为我觉得有点卡在这个自动取款机上。