Skip to content
大纲

图的布局 - 一般布局

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;
};