力导向 (Force-directed) 布局算法绘图(布点)的简单实现

描述

本文简要介绍力导向算法的原理,提供了源码和D3绘制的实验结果图。

Force-Directed Layout algorithms are graph drawing algorithms based only on information contained within the structure of the graph itself rather than relying on contextual information.

力导向布局算法是一类绘图算法,它仅仅基于图的解构本身来绘图,而不依赖于上下文信息。

力导向绘图 (Force-directed graph drawing)可以用于描述关系图的结点之间的关系,把结点分布到画布上合理的位置,比如描述企业之间的关系,社交网络中的人际关系等。

原理

斥力(Repulsive Force)

把每个节点看做一个电荷,电荷与电荷之间存在斥力,也就是库仑力,根据库仑定律( Coulomb's law),电子之间的斥力可以这么计算:

Coulomb's law

假设每个电子的电量都是1,那就有:

F = k/r2.

常数k可以根据画布大小和电子数量计算。
由于需要更新x,y坐标,可以分别计算斥力产生的正向位移。

displacementX =  distX / dist * k * k / dist * ejectFactor

*关于计算x, y偏移和常数k的方式,可能并没有特别明确的方式,这里可能并不是最优的方法。

引力(Traction Force)

一些粒子之间被一些边所牵连,这些边产生类似弹簧的胡克引力:

Fs=ks(x−x0)

牵制着边两端的粒子。斥力和引力不断作用,粒子在不断位移之后趋于平衡,逐渐不再发生相对位移,能量不断消耗,最终趋于零。

在引力和斥力地作用下不断地更新坐标,经过多次迭代达到一个稳定状态,收敛结束。参数和迭代次数需要调试。

我分别用Java和JavaScript简单实现了这个算法,并且利用D3做图形化展示,下面是一些跑出来的数据呈现出的分布图:

用Java和JavaScript简单实现了这个算法,一些数据分布如下:

Graph 1. Iteration simulation of 24 nodes.
Graph 2. Randomly generated 20 nodes, each having 1~7 links.
Graph 3. Simulation of 100 nodes, iterating for 200 times.

代码

代码在我的Github上。


Refs:
https://www.ibm.com/developerworks/cn/web/0909_fudl_flashsocial/#major3
https://blog.csdn.net/newworld123made/article/details/51443603
http://philogb.github.io/blog/2009/09/30/force-directed-layouts/
https://bl.ocks.org/mbostock/4557698

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • D3.js里面有个force类可以实现对网络拓扑图的绘画,其根本基础是基于力导向算法来实现的。相关API信息如下:...
    bobcorbett阅读 4,150评论 1 3
  • 2017年5月8日 一、背景 力导向图非常适合于渲染关系型信息图。 二、什么是力导向图(Force-directe...
    HeyDelilah阅读 21,317评论 3 9
  • 今天鱼仔不想读经典,也不想去学跳舞,但还是坚持下来!引导真的好重要,人总是会有放弃的时候,但跨过去就好了!从小就是...
    miracleyiu阅读 155评论 0 0
  • 小宝儿,昨晚发烧了,可把我急坏了,我骑着车子就往外跑,他爸喊我“回来,吃了饭再去”,我不听“我不,我不去药店就关...
    王爷有酒阅读 319评论 0 1
  • 音频:unit 08 unit 10 儿歌:泛听 retell 1.Allen, let's watch the ...
    DS鑫花璐放阅读 352评论 0 0