图的布局 - 一般布局
Random
未指定布局且节点中没有位置信息时,默认使用 Random 布局
ts
type Random = {
center: [number, number]; // 图的中心
width: number; // 图的宽度
height: number; // 图的高度
workerEnabled: boolean; // 是否启用 web worker
};GForce
ts
type GForce = {
center: [number, number];
linkDistance: number | (e: Edge) => number; // 边长
nodeStrength: number | (n: Node) => number; // 节点作用力,正数表示斥力,负数表示引力
edgeStrength: number | (e: Edge) => number; // 边的作用力,默认根据节点的出入度自适应
preventOverlap: boolean; // 是否防重叠,需要配置 nodeSize
nodeSize: number; // 节点大小,默认取节点数据中的 size 字段,或默认值 10
nodeSpacing: number | (n: Node) => number; // 防止重叠时节点编译间距最小值,preventOverlap 为 true 时生效
minMovement: number; // 当一次迭代的平均移动长度小于该值时停止迭代
maxIteration: number; // 最大迭代次数
damping: number; // 阻尼系数,取值范围 [0,1]
maxSpeed: number; // 一次迭代的最大移动长度
coulombDisScale: number; // 库伦系数,数字越大节点间斥力越大
getMass: (n: Node) => number; // 节点的质量
getCenter: (n: Node, degree: number) => [number, number]; // 节点中心力的 [x, y]
gravity: number; // 中心力大小,越大布局越紧凑
onTick: Function; // 每次迭代后回调
onLayoutEnd: Function; // 布局完成后回调
workerEnabled: boolean; // 是否启用 web worker
gpuEnabled: boolean; // 是否启用GPU并行计算
}Force
ts
type Force = {
center: [number, number];
linkDistance: number | (e: Edge) => number; // 边长
nodeStrength: number | (n: Node) => number; // 节点作用力,正数表示斥力,负数表示引力
edgeStrength: number | (e: Edge) => number; // 边的作用力,默认根据节点的出入度自适应
preventOverlap: boolean; // 是否防重叠,需要配置 nodeSize
nodeSize: number; // 节点大小,默认取节点数据中的 size 字段,或默认值 10
nodeSpacing: number | (n: Node) => number; // 防止重叠时节点编译间距最小值,preventOverlap 为 true 时生效
alphaDecay: number; // 迭代阈值的衰减率,取值 [0, 1]
alphaMin: number; // 停止迭代的阈值
alpha: number; // 当前阈值
colideStrength: number; // 防止重叠的力强度,取值 [0, 1]
clustering: boolean; // 是否按照聚类信息布局
clusterNodeStrength: number; // 聚类节点作用力,负数表示斥力
clusterEdgeStrength: number; // 聚类边作用力
clusterEdgeDistance: number; // 聚类边长度
clusterNodeSize: number; // 聚类节点直径
clusterFociStrength: number; // 用于 foci 的力
forceSimulation: Object; // 自定义 force 方法,默认使用 d3 的方法
onTick: Function; // 每次迭代后回调
onLayoutEnd: Function; // 布局完成后回调
workerEnabled: boolean; // 是否启用 web worker
}Fruchterman
ts
type Fruchterman = {
center: [number, number]; // 布局的中心
maxIteration: number; // 最大迭代次数
gravity: number; // 重力大小,影响布局的紧凑程度
speed: number; // 每次迭代节点移动的速度。速度太快可能会导致强烈震荡
clustering: boolean; // 是否按照聚类布局
clusterGravity: number; // 聚类内部的重力大小,影响聚类的紧凑程度
workerEnabled: boolean; // 是否启用 web worker
gouEnabled: boolean; // 是否启用 GPU 并行计算
};Circular
环状布局
ts
type Circular = {
center: [number, number];
radius: number; // 圆的半径
startRadius: number; // 起始半径
endRadius: number; // 结束半径
clockwise: boolean; // 是否顺时排列
divisions: number; // 节点在环上的分段数 (需 startRadius != endRadius)
ordering: "topology" | "degree"; // 拓扑排序 | 度数排序
angleRatio: number; // 从第一个节点到最后节点之间相隔多少个 2*PI
workerEnabled: boolean;
};Radial
辐射状布局
ts
type Radial = {
center: [number, number];
linkDistance: number;
maxIteration: number;
focusNode: string | Node; // 中心点,默认为数据中第一个节点。可以传入节点 id 或节点本身。
unitRadius: number; // 每一圈距离上一圈的距离
preventOverlap: boolean;
maxPreventOverlapIteration: number; // 防止重叠步骤的最大迭代次数
nodeSize: number;
nodeSpacing: number | (node: Node) => number;
strictRadial: boolean; // 是否必须是严格的 radial 布局,即每一层的节点严格布局在一个环上。preventOverlap 为 true 时生效
sortBy: 'data' | string; // 同层节点布局后相距远近的依据。'data' 表示按照节点在数据中的顺序排列,或者指定节点中的字段名称
sortStrength: number; // 同层节点根据 sortBy 排列的强度,数值越大,sortBy 指定的方式计算出距离越小的越靠近
workerEnabled: boolean; // 是否启用 web worker
};MDS
一种高维数据降维布局
ts
type MDS = {
center: [number, number];
linkDistance: number; // 边长
workerEnabled: boolean;
};Dagre
层次布局
ts
// T: top, B: bottom, U: upper, D: down, L: left, R: right
type Dagre = {
rankdir: "TB" | "BT" | "LR" | "RL"; // 布局方向,默认 'TB'
align: "UL" | "UR" | "DL" | "DR" | undefined; // 节点对齐方式。默认 undefined
nodesep: number; // 节点间距,间距方向与 rankdir 相对应,优先级高于 nodesepFunc
ranksep: number; // 层间距,间距方向与 rankdir 相对应,优先级高于 ranksepFunc
nodesepFunc: (node: Node) => number; // 节点间距
ranksepFunc: (node: Node) => number; // 层间距
controlPoints: boolean; // 是否保留布局连线的控制点
workerEnabled: boolean;
sortByCombo: boolean; // 同层节点是否根据每个节点数据的 comboId 排序,以防 combo 重叠
};Concentric
同心圆布局
ts
type Concentric = {
center: [number, number];
nodeSize: number;
minNodeSpacing: number;
preventOverlap: boolean;
sweep: number;
equidistant: boolean;
};