【React】Sigma.js框架网络图-入门篇

news2025/1/15 19:38:59

一、介绍

Sigma.js是一个专门用于图形绘制的JavaScript库 它使在Web页面上发布网络变得容易,并允许开发人员将网络探索集成到丰富的Web应用程序中。
Sigma.js提供了许多内置功能,例如CanvasWebGL渲染器或鼠标和触摸支持,以使用户在网页上的网络操作流畅且快速。
通过使用Sigma.js,用户可以方便地创建和展示网络图,从而更好地理解和分析数据之间的关系。

在这里插入图片描述

二、实战

1、环境&目录结构

在这里插入图片描述

  • Next.js初始化
# npx create-next-app@latest
# ...
√ What is your project named? ... graph-sigma
√ Would you like to use TypeScript? ... Yes
√ Would you like to use ESLint? ... No
√ Would you like to use Tailwind CSS? ... No
√ Would you like to use `src/` directory? ... Yes
√ Would you like to use App Router? (recommended) ... Yes
√ Would you like to customize the default import alias (@/*)? ... Yes
√ What import alias would you like configured? ... @/*
  • sigma.js安装

需要安装两个核心库:sigmagraphology

  • Sigma: 它支持多种布局算法,并允许用户通过鼠标和触摸来交互网络。提供丰富的API和配置选项,使得网络图的绘制和定制变得相对简单。
  • Graphology 是一个简单、高效且灵活的图形数据结构库,它支持节点和边的添加、删除和查询操作,并提供了许多用于分析图形结构的实用方法。GraphologySigma.js 常常一起使用,因为 Sigma.js 可以使用 Graphology 作为其后端图形数据结构。
npm install sigma graphology
  • package.json配置
"dependencies": {
   "graphology": "^0.25.4",
   "next": "14.2.2",
   "react": "^18",
   "react-dom": "^18",
   "sigma": "^3.0.0-beta.17"
}

2、sigma组件使用示例

在这里插入图片描述

import type {Node, Edge} from "@/component/SigmaGraph/types.d";

import SigmaGraph from "@/component/SigmaGraph";
import SigmaGraphData from "@/component/SigmaGraph/SigmaGraphData";

export default function Home() {
    // 示例:节点 数据
    const nodes:Node[] = [
        {id: "1", label: "Node 1", x: 0, y: 0, size: 10, color: "blue" },
        {id: "2", label: "Node 2", x: 1, y: 1, size: 20, color: "red" },
    ];
    // 示例:边 数据
    const edges:Edge[] = [
        {source: "1", target: "2", size: 5, color: "purple"}
    ];

    return (
        <div style={{width: '50vw', height: '50vh', backgroundColor: "#eee"}}>
            <SigmaGraph>
                <SigmaGraphData nodes={nodes} edges={edges}/>
            </SigmaGraph>
        </div>
    );
}

3、创建sigma组件

next.js中,切记sigma.js的一切代码只能在客户端模式下进行

在根目录的component目录创建一个SigmaGraph目录和其他准备文件
在这里插入图片描述

  • types.d.ts声明文件
// 节点(Node)、边(Edge)数据结构声明
export type Node = {
    id: string,
    [key: string]: any
}

export type Edge = {
    source: string,
    target: string,
    [key: string]: any
}
  • index.tsx父组件
"use client";

import type {Attributes} from "graphology-types";
import type {Settings} from "sigma/settings";

import React, {useEffect, useRef, useState, createContext, useContext, useMemo} from "react";
import Graph from "graphology";
import Sigma from "sigma";

// 声明组件可传参数
type SigmaGraphProps = {
    children?: React.ReactNode,
    settings?: Partial<Settings>
}

// 创建 SigmaGraph 上下文
export const SigmaGraphContext = createContext<Sigma<Attributes, Attributes, Attributes>|null>(null);

// 定义div容器基本样式(一定要有宽高设定)
const containerStyle: React.CSSProperties = {
    width: '100%',
    height: '100%'
}

let graph: Graph | null = new Graph;

const SigmaGraph = function ({children, settings}: SigmaGraphProps) {
    const containerRef = useRef<HTMLDivElement>(null);
    const [sigma, setSigma] = useState<any>(null);

    // 默认配置
    const sigmaSettings: Partial<Settings> = useMemo(() => (Object.assign({}, {
        allowInvalidContainer: true,
    }, settings || {})), [settings])
    //
    useEffect(() => {
        if (typeof window !== 'undefined' && containerRef.current) {
            const sigmaInstance = new Sigma(graph, containerRef.current, sigmaSettings);

            // 为上下文操作准备 graph 和 sigma 实例
            setSigma(sigmaInstance);
        }
    }, []);
    //
    return (
        <SigmaGraphContext.Provider value={sigma}>
            <div ref={containerRef} style={containerStyle}>
                {children}
            </div>
        </SigmaGraphContext.Provider>
    )
}

// 导出 sigma hook
export const useSigma = () => useContext(SigmaGraphContext);

// 导出 graph hook
export const useGraph = () => graph;

export default SigmaGraph;
  • SigmaGraphData.tsx子组件:用于数据更新、维护
"use client";

import type {Node, Edge} from "./types.d";

import {useSigma, useGraph} from "./index"
import React, {useEffect} from "react";

// 声明组件可传参数
type SigmaDataProps = {
    nodes: Node[],
    edges: Edge[],
}

const SigmaGraphData = function ({nodes, edges}:SigmaDataProps) {
    // 挂载 sigma、graph
    const sigma = useSigma();
    const graph = useGraph();

    useEffect(() => {
        if (!sigma || !graph)return;

        // 清空原有数据
        graph.clear();

        // 添加 节点 数据
        nodes.forEach((node: Node)=>{
            graph.addNode(node.id, node);
        });

        // 添加 边 数据(也就是节点之间的关系)
        edges.forEach((edge: Edge)=>{
            graph.addEdge(edge.source, edge.target, edge);
        });

        sigma.refresh();

        // 组件销毁时 清空
        return () => graph.clear();
    }, [graph,sigma, nodes, edges]);

    return <></>
}

export default SigmaGraphData;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1609000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构】图论(图的储存方式,图的遍历算法DFS和BFS、图的遍历算法的应用、图的连通性问题)

目录 图论一、 图的基本概念和术语二、图的存储结构1. 数组(邻接矩阵)存储表示无向图的数组(邻接矩阵)存储表示有向图的数组(邻接矩阵)存储表示 邻接表存储表示有向图的十字链表存储表示无向图的邻接多重表存储表示 三、图的遍历算法图的遍历——深度优先搜索&#xff08;DFS&a…

cdp集群Hbase组件HRegionServer服务停止原因以及排查

前言&#xff1a;重启集群后某一节点HRegionServer服务停止&#xff0c;重启前所有服务均正常 去查看日志&#xff1a; 日志报错 ERROR HRegionServer Master rejected startup because clock is out of sync org.apache.hadoop.hbase.ClockOutOfSyncException: org.apache.h…

Amazon云计算AWS之[1]基础存储架构Dynamo

文章目录 Dynamo概况Dynamo架构的主要技术主要问题及解决方案Dynamo的存储节点数据均衡分布的问题一致性哈希算法改进一致性哈希算法 数据备份数据冲突问题成员资格及错误检测容错机制临时故障处理机制永久性故障处理机制 Dynamo概况 面向服务的Amazon平台基本架构为了保证其稳…

【深度学习】Vision Transformer

一、Vision Transformer Vision Transformer (ViT)将Transformer应用在了CV领域。在学习它之前&#xff0c;需要了解ResNet、LayerNorm、Multi-Head Self-Attention。 ViT的结构图如下&#xff1a; 如图所示&#xff0c;ViT主要包括Embedding、Encoder、Head三大部分。Class …

小球反弹(蓝桥杯)

文章目录 小球反弹【问题描述】答案&#xff1a;1100325199.77解题思路模拟 小球反弹 【问题描述】 有一长方形&#xff0c;长为 343720 单位长度&#xff0c;宽为 233333 单位长度。在其内部左上角顶点有一小球&#xff08;无视其体积&#xff09;&#xff0c;其初速度如图所…

Targeted influence maximization in competitive social networks

abstract 利用口碑效应的广告对于推销产品是相当有效的。在过去的十年中&#xff0c;人们对营销中的影响力最大化问题进行了深入的研究。影响力最大化问题旨在将社交网络中的一小群人识别为种子&#xff0c;最终他们将引发网络中最大的影响力传播或产品采用。在网络营销的实际场…

微信小程序日期增加时间完成订单失效倒计时(有效果图)

效果图 .wxml <view class"TimeSeond">{{second}}</view>.js Page({data: {tiem_one:,second:,//倒计时deadline:,},onLoad(){this.countdown();},countdown(){let timestamp Date.parse(new Date()) / 1000;//当前时间戳let time this.addtime(2024…

记一次中间件宕机以后持续请求导致应用OOM的排查思路(server.max-http-header-size属性配置不当的严重后果)

一、背景 最近有一次在系统并发比较高的时候&#xff0c;数据库突然发生了故障&#xff0c;导致大量请求失败&#xff0c;在数据库宕机不久&#xff0c;通过应用日志可以看到系统发生了OOM。 二、排查 初次看到这个现象的时候&#xff0c;我还是有点懵逼的&#xff0c;数据库…

k8s 部署 kube-prometheus监控

一、Prometheus监控部署 1、下载部署文件 # 使用此链接下载后解压即可 wget https://github.com/prometheus-operator/kube-prometheus/archive/refs/heads/release-0.13.zip2、根据k8s集群版本获取不同的kube-prometheus版本部署 https://github.com/prometheus-operator/k…

基于SSM的物流快递管理系统(含源码+sql+视频导入教程+文档+PPT)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的物流快递管理系统2拥有三个角色&#xff1a; 管理员&#xff1a;用户管理、管理员管理、新闻公告管理、留言管理、取件预约管理、收件管理、货物分类管理、发件信息管理等 用户…

C#在窗体中设计滚动字幕的方法:创建特殊窗体

目录 1.涉及到的知识点 (1)Timer组件 (2)Label控件的Left属性 (3)启动和关闭Timer计时器 2. 实例 &#xff08;1&#xff09;Resources.Designer.cs设计 &#xff08;2&#xff09; Form1.Designer.cs设计 &#xff08;3&#xff09;Form1.cs设计 &#xff08;4&#…

社交媒体数据恢复:与你科技

在数字时代&#xff0c;数据是我们生活中的重要组成部分。无论是个人照片、文档&#xff0c;还是企业的重要资料&#xff0c;数据在我们的生活中扮演着举足轻重的角色。然而&#xff0c;数据丢失的问题时常发生&#xff0c;给我们带来了很多麻烦。幸运的是&#xff0c;当下众多…

CentOS 7静默安装Oracle 11g(记一次最小化CentOS 7安装Oracle 11g的经历)

# [pdf在线免费转word文档](https://orcc.online/pdf) https://orcc.online/pdf 1.最小化安装CentOS 7后首先设置一下固定IP 可以先查询一下自己的网卡设备的名称&#xff0c;是ens33&#xff0c;所以网卡配置文件名称就是ifcfg-ens33&#xff08;前面的ifcfg-不用管&#xf…

Discuz! X3.4 升级至 Discuz! X3.5 详细教程

第一步&#xff1a;从其他以前的 Discuz! X 版本升级Discuz! X3.4 请先升级到Discuz! X3.4&#xff0c;升级教程网上比较普遍&#xff0c;在此不再论述。 第二步&#xff1a;Discuz! X3.4 升级至 Discuz! X3.5 &#xff08;Discuz 从 X3.5 以后&#xff0c;不在发布GBK版本&…

【Unity学习笔记】第十三 · tag与layer(运行时创建tag和layer)

参考&#xff1a; Unity手册 标签Unity手册 LayersIs it possible to create a tag programmatically?脚本自动添加tag和Layer 注&#xff1a;本文使用Unity版本是2022.3.23f1 转载引用请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/de…

c++使用googletest进行单元测试

googletest进行单元测试 使用Google test进行测试一、单元测试二、使用gmock测试 使用Google test进行测试 使用场景&#xff1a; 在平时写代码中&#xff0c;我们需要测试某个函数是否正确时可以使用Google test使用&#xff0c;当然&#xff0c;我们也可以自己写函数进行验证…

给rwkv-pytorch 写个chat ui demo

rwkv-pytorch 项目地址 rwkv-pytorch from nicegui import uimessage_dict {1: [{"name":"Assistant","text":"你好"}]} current_name 1 import aiohttpasync def get_text_async(text"Hello, how are you?"):# 定义AP…

JAVA 项目<果园之窗>_1

这几天有空看能不能把水果店管理系统整出来&#xff0c;目标是整个网页版本的&#xff0c;以我的电脑做服务器&#xff0c;数据存在mysql中 以我目前的理解整个项目大致可分为前端部分、后端部分、数据库部分&#xff0c;也就这三个部分 目前打开并运行了一个别人的项目&#…

盒子模型之怪异盒模型

这个是标准盒模型 这个是怪异盒模型 box-sizing:content-box;默认是标准盒模型 box-sizing:border-box;是怪异盒模型&#xff0c;会挤压里面的内容&#xff0c;不管怎么设置边框始终都是当初设置的200px <!DOCTYPE html> <html lang"en"> <head>…

MongoDB学习【一】MongoDB简介和部署

MongoDB简介 MongoDB是一种开源的、面向文档的、分布式的NoSQL数据库系统&#xff0c;由C语言编写而成。它的设计目标是为了适应现代Web应用和大数据处理场景的需求&#xff0c;提供高可用性、横向扩展能力和灵活的数据模型。 主要特点&#xff1a; 文档模型&#xff1a; Mon…