JavaScript is required

force-自定义力学布局

自定义力学布局与节点聚类

演示自定义力导向布局算法,实现基于颜色属性的节点聚类,并支持实时物理参数调整。

自定义力学布局与节点聚类

功能概述

此示例演示了一个自定义力导向布局算法,该算法实现了基于颜色的节点聚类。与仅处理节点斥力和连线弹性的标准力学布局不同,此自定义布局在相同颜色的节点之间添加了吸引力,从而实现按属性自动分组。

核心特性实现

自定义力学布局类

MyForceLayout 类扩展了基础布局功能以添加基于颜色的吸引力:

  • 节点斥力:控制节点相互排斥的强度
  • 连线弹性:控制连接节点之间的弹簧力
  • 颜色吸引力:将相同颜色的节点拉到一起的自定义逻辑
const myLayout = new MyForceLayout({
    maxLayoutTimes: Number.MAX_SAFE_INTEGER,
    force_node_repulsion,
    force_line_elastic
}, graphInstance.getOptions(), graphInstance);
graphInstance.setLayoutor(myLayout, true, true);

动态布局参数更新

示例提供实时滑块来调整物理参数:

  • 节点斥力系数(0.01 - 1.2):较高的值增加分离力,但可能导致抖动
  • 连线弹性系数(0.01 - 1.2):较高的值增强连接,但可能导致不稳定
const updateLayoutOptions = async () => {
    graphInstance.stopAutoLayout();
    const forceLayout = graphInstance.layoutor as MyForceLayout;
    if (forceLayout) {
        forceLayout.updateOptions({
            force_node_repulsion,
            force_line_elastic
        });
        forceLayout.start();
    }
    graphInstance.startAutoLayout();
};

随机颜色分配和重新聚类

按钮触发随机颜色重新分配并观察布局重新组织:

const resetNodeColor = async () => {
    graphInstance.getNodes().forEach(node => {
        const newColor = ['red', 'yellow', 'blue'][Math.floor(Math.random() * 3)];
        graphInstance.updateNode(node, { color: newColor });
    });
    await graphInstance.sleep(600);
    await updateLayoutOptions();
};

初始节点定位

节点在力学布局开始之前被随机定位:

data.nodes.forEach(node => {
    node.x = Math.random() * 300;
    node.y = Math.random() * 300;
    node.color = ['red', 'yellow', 'blue'][Math.floor(Math.random() * 3)];
});

布局生命周期管理

组件正确启动和停止自动布局动画:

useEffect(() => {
    initializeGraph();
    return () => {
        graphInstance.stopAutoLayout();
    };
}, []);

创意使用场景

  • 数据聚类可视化:按类别、状态或任何属性自动分组项目
  • 社交网络分析:通过视觉聚类显示社区检测
  • 市场细分:按行为或人口统计数据对客户细分进行分组
  • 知识图谱:将相关概念聚集在一起以便更好地理解
  • 生物网络:按功能相似性对蛋白质或基因进行分组