D3 力布图
2022-04-21
力布图,也被称之为力导向图(Force
),通过使用布局可以物理模拟
的方式将力导向图更加灵活的实现位置的简单控制与计算。而力导向图本身是一种绘图算法
,即在二位或三维空间中配置一个节点,节点之间通过直线连接,这种方式被称之为连线,每次连线的长度基本长度相等,需要注意的是这种线会显得尽量不可相交。
节点和连线都被施加了力的作用,根据力的作用,来计算出节点和连线的运动轨迹,最终使得让他们呈现一种静止的画面。
ID | DA | FA |
---|---|---|
d3.layout.force | 创建一个力布图,即力导向图布局 |
|
force.size([size]) | 设置胡获取力布图的作用范围,size 主要影响里到力布图的重力中心和初始的随机位置,默认为1x1 |
|
force.nodes([node]) | 设置或获取力导向图的布局节点数组,默认为返回当前节点数组 | |
force.charge([charge]) | 指定电荷强度,主要用于决定是排斥还是吸引,如果输入的值是正 的则导致节点互相吸引,输入负值 则会导致节点互相排斥 。(需要足以的是,电荷是通过使用Barnes-Hut 算法进行实现的) |
|
force.links([links]) | 设置或获取力布图的连接数组,默认为返回当前的连接数组 | |
force.linkDistance([distance]) | 设置链接点间目标距离的连线长度,默认为20 |
|
force.start() | 启动模拟,首次创建 力布图时必须被调用,然后分配节点和链接,当节点发生变化的时候将会再次被调用,通过此函数可以及那指定从何时开始计算。 |
|
force.tick() | 进入力布图的仿真步骤,主要通过配合start and stop 来计算出静态布局 |
|
force.on(type,listener) | type 是一个事件类型,主要有:start、tick、end 三种,而listener 则是监听器,主要用于更新节点和链接的显示位置 |
|
force.drag() | 绑定一个行为允许的交互式托转节点,drag 函数主要用于实现拖拽操作 |
布局运算
当通过下述 code 运行之后,那么数据将会通过start()
进行转换,转换后的数据将会发生变化,原有的节点将会得出index、x、y、px、py、fixed、weight
等额外属性,这些属性分别意思为索引、x坐标、y坐标、上一时刻的x坐标、上一时刻的y坐标、节点是否固定、节点有多少连线并与之相连
。
而链接数组将会返回出的数据我们可以的出两个非常重要的点即source
和targe
,分别代表来来源与目标
,就如source: 0, target: 2
,那么就表述数组one
链接2
,在这里我们需要注意的是,D3 是从0开始计算的,或者说我不能链接我自己,source: 0, targe: 0
1 | /* 基本 svg 规格 */ |
力布图
绘制力布图
在下述的 code 中我们主要绘制了连接线
及其样式、还有圆
的绘制与样式,在这其中,主要通过使用drag
来赋予圆可以被拖拽
,之后通过使用.on
来重新计算出链接点的坐标以及文字的坐标。
1 | /* 基本 svg 规格 */ |
CSS
1 | .forceLine { |
on
如一开始介绍的函数方法一样,force.on(type.listener)
是一个监听器可通过使用on
进行更新节点以及链接的显示位置,当然也可以设置拖拽后固定对象的位置,可添加:
1 | var drag = force.drag() |