Vue3-Vite-ts 前端生成拓扑图vis,复制即用

完整代码,复制即可用,样式自调
试过 jointjs dagre-d3
vis,好用一点,可添加同层的双向箭头

方法1:Vis.js

npm install vis-network

<template><div id="mynetwork" class="myChart" :style="{width: '100%', height: '90vh'}"></div>
</template>
<script setup lang="ts">
import 'vis-network/dist/dist/vis-network.min.css'
import vis from 'vis-network/dist/vis-network.min'
import { onMounted, ref } from 'vue';
onMounted(() => {makeVis()
})
const mynetwork = ref()
const makeVis = () => {var nodes = [ // 每行加上shape: 'circle' ,则节点显示圆形{id: 1, label: 'Node 1'},{id: 2, label: 'Node 2'},{id: 3, label: 'Node 3'},{id: 4, label: 'Node 4'},{id: 6, label: 'Node 6'},{id: 7, label: 'Node 7'},{id: 8, label: 'Node 8'},{id: 9, label: 'Node 9'},{id: 5, label: 'Node 5'},]var edges = [ // 每行加上label: '关系名称',则会在线中间显示节点关系名{from: 1, to: 3},{from: 1, to: 2},{from: 2, to: 4},{from: 2, to: 5},{from: 6, to: 5},{from: 6, to: 7},{from: 8, to: 6},{from: 7, to: 9},//{from: 2, to: 6},//{from: 6, to: 2},]var data = {nodes: nodes,edges: edges}var container = document.getElementById('mynetwork')var options = {nodes: {shape: 'box', //设置节点node样式为矩形fixed: false, //节点node固定可移动font: {color: 'red', //字体的颜色size: 20, //显示字体大小},scaling: {min: 16,max: 32, //缩放效果比例},borderWidth: 1,color: {border: 'red',background: 'white' // 若是引用图标,背景颜色}},// groups: {//   ws: { // 系统定义的形状 dot等 这些官网都可以找到//     shape: 'dot',//     color: 'white'//   }// },layout: {// randomSeed: 1, // 配置每次生成的节点位置都一样,参数为数字1、2等//以分层方式定位节点hierarchical: {direction: 'UD', //分层排序方向sortMethod: 'directed', //分层排序方法levelSeparation: 100, //不同级别之间的距离nodeSpacing: 200, // 节点之间的距离},},physics: {enabled: false,// 避免重叠hierarchicalRepulsion: {avoidOverlap: '1',},// barnesHut: { gravitationalConstant: -30000 },// barnesHut: {//   gravitationalConstant: -80000,//   springConstant: 0.001,//   springLength: 200// },// stabilization: false// { iterations: 2500 }},interaction: {// navigationButtons: true,hover: false, // 鼠标移过后加粗该节点和连接线selectConnectedEdges: false, // 选择节点后是否显示连接线hoverConnectedEdges: false, // 鼠标滑动节点后是否显示连接线tooltipDelay: 200,dragNodes: false, // 是否能拖动节点dragView: true, // 是否能拖动画布zoomView: true // 是否能缩放画布},edges: {color: { // 连接线的样式color: '#848484',highlight: 'white',hover: '#848484',inherit: 'from',opacity: 1.0},// font: {//   align: 'top', //连接线文字位置// },shadow: true, // 连接线阴影配置smooth: true // 是否连线平滑//arrows: {to : true }//是否显示方向箭头 箭头指向to节点}}const network = new vis.Network(container, data, options)network.on('click',(params) => {console.log(params);})}
</script>

效果
在这里插入图片描述

// 测试双向绑定 配置level
var nodes = [ // 每行加上shape: 'circle' ,则节点显示圆形{id: 1, label: 'Node 1',level: 1},{id: 2, label: 'Node 2',level: 2},{id: 3, label: 'Node 3',level: 4},{id: 4, label: 'Node 4',level: 4},{id: 6, label: 'Node 6',level: 2},{id: 7, label: 'Node 7',level: 3},{id: 8, label: 'Node 8',level: 4},{id: 9, label: 'Node 9',level: 4},{id: 5, label: 'Node 5',level: 3}
]
var edges = [ // 每行加上label: '关系名称',则会在线中间显示节点关系名{from: 1, to: 3},{from: 1, to: 2},{from: 2, to: 4},{from: 2, to: 5},{from: 2, to: 6},{from: 6, to: 2},{from: 6, to: 5},{from: 6, to: 7},{from: 6, to: 8},{from: 5, to: 8},{from: 7, to: 9},]
//edges配置
//smooth: true // 是否连线平滑
arrows: {to : true }//是否显示方向箭头 箭头指向to节点

效果
在这里插入图片描述
自定义节点样式

let newNodes = [] as any
nodes.map((item: any) => {const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="120" height="50"><foreignObject x="0" y="0" width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml" style="border:1px solid #0fb2cc; z-index:11;background-color: #FFF"><div style="height: 40px;">${item.label}</div></div></foreignObject></svg>`;const url = `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;newNodes.push({id: item.id,level: item.level,shape: "image",image: url})
})
var data = {nodes: newNodes,edges: edges
}

效果
在这里插入图片描述

方法2 -dagre-d3

npm i d3@5.16.0

npm i dagre-d3@0.6.4

<template><div ><svg class="dagre" width="1500" height="800"><g class="container"></g></svg></div>
</template><script setup lang="ts">
import { ref, onMounted, watch } from "vue";
import dagreD3 from "dagre-d3";
import * as d3 from "d3";
const draw = () => {var nodes = [ // 每行加上shape: 'circle' ,则节点显示圆形{id: 1, label: 'Node 1'},{id: 2, label: 'Node 2'},{id: 3, label: 'Node 3'},{id: 4, label: 'Node 4'},{id: 6, label: 'Node 6'},{id: 7, label: 'Node 7'},{id: 8, label: 'Node 8'},{id: 9, label: 'Node 9'},{id: 5, label: 'Node 5'}]var edges = [ // 每行加上label: '关系名称',则会在线中间显示节点关系名{from: 1, to: 3},{from: 1, to: 2},{from: 2, to: 4},{from: 2, to: 5},{from: 6, to: 5},{from: 6, to: 7},{from: 8, to: 6},{from: 7, to: 9},]// 创建 Graph 对象const g = new dagreD3.graphlib.Graph().setGraph({zoom: 1,rankdir: "TB", // 流程图从下向上显示,默认'TB',可取值'TB'、'BT'、'LR'、'RL'// align: 'UL', //节点的对齐方式。有4个值: UL,UR,DL,DR。// acyclicer: 'greedy',//如果设置为贪婪模式(greedy), 则使用贪婪启发式来查找. 返回的弧设置是一组可以删除的线, 从而使图无环.//ranker: "network-simplex",//连线算法// nodesep: 120, //水平方向上, 分隔节点的距离(节点之间的间距)// edgesep: 100,//在水平方向上, 线段间的距离// ranksep: 50,//每个层级间的距离// marginx: 200,//图形左右边缘的距离// marginy: 20,//图形上下边缘的距离}).setDefaultEdgeLabel(function () {return {};});nodes.forEach((node) => {g.setNode(node.id, {id: node.id,label: `<foreignObject id='${node.id}'><div id='${node.id}'><span>${node.label}</span></div></foreignObject>`, //node.nodeName,labelType: "html",shape: "rect", //节点形状,可以设置rect(长方形),circle,ellipse(椭圆),diamond(菱形) 四种形状,还可以使用render.shapes()自定义形状style: "fill:#333;stroke:#a0cfff;stroke-width: 2px;",  //节点样式,可设置节点的颜色填充、节点边框labelStyle: "fill: #ddd;font-weight:bold;",  //节点标签样式, 可设置节点标签的文本样式(颜色、粗细、大小)rx: 5, // 设置圆角ry: 5, // 设置圆角// paddingBottom: 0,// paddingLeft: 0,// paddingRight: 0,// paddingTop: 0,`});});// Graph添加节点之间的连线if (nodes.length > 1) {edges.forEach((edge) => {g.setEdge(edge.from, edge.to, {// curve: d3.curveBasis , //d3.curveBasis 贝塞尔曲线  curveStepBefore直线style: "stroke: #0fb2cc; fill: none; stroke-width: 1px", // 连线样式arrowheadStyle: "fill: #0fb2cc;stroke: #0fb2cc;", //箭头样式,可以设置箭头颜色arrowhead: "vee", //箭头形状,可以设置 normal,vee,undirected 三种样式,默认为 normal});});}// 获取要绘制流程图的绘图容器const container = d3.select("svg.dagre").select("g.container");// 创建渲染器const render = new dagreD3.render();// 在绘图容器上运行渲染器绘制流程图render(container, g);let svg = d3.select('svg.dagre')// 建立拖拽缩放let zoom = d3.zoom().on("zoom", function () {container.attr("transform", d3.event.transform);});svg.call(zoom);
};
onMounted(() => {draw();
});
</script>

效果
在这里插入图片描述

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

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

相关文章

通过DirectML和ONNXRuntime运行Phi-3模型

更多精彩内容&#xff0c;欢迎关注我的公众号“ONE生产力”&#xff01; 上篇我们讲到通过Intel Core Ultra系列处理器内置的NPU加速运行Phi-3模型&#xff0c;有朋友评论说他没有Intel处理器是否有什么办法加速Phi-3模型。通常&#xff0c;使用GPU特别是NVIDA的GPU加速AI模型…

混剪素材库有哪些?分享7个高质量混剪视频素材网站

作为自媒体创作者&#xff0c;我们经常需要高质量的混剪视频素材来吸引观众。今天&#xff0c;我将为大家介绍几个优质的视频素材网站&#xff0c;确保您的短视频制作既高效又充满创意。 蛙学府素材网 首推蛙学府素材网&#xff0c;这个平台真是创作者的福音。无论是短视频素材…

重磅消息! Stable Diffusion 3将于6月12日开源 2B 版本的模型,文中附候补注册链接。

在OpenAI发布Sora后&#xff0c;Stability AI也发布了其最新的模型Stabled Diffusion3, 之前的文章中已经和大家介绍过&#xff0c;感兴趣的小伙伴可以点击以下链接阅读。Sora是音视频方向&#xff0c;Stabled Diffusion3是图像生成方向&#xff0c;那么两者没有必然的联系&…

electron-Vue: Module parse failed: Unexpected character ‘ ‘

​ electron-Vue项目中&#xff0c;我自己写了一个node的C扩展&#xff08;xx.node&#xff09;&#xff0c;然后在.vue文件里import它&#xff0c;然后运行npm run electron:serve&#xff0c;报错如下: ​​ electron-Vue打包默认使用webpack&#xff0c;默认情况下webpack没…

盘点哪些企业容易被ddos攻击

DDoS&#xff08;分布式拒绝服务&#xff09;攻击已成为网络安全威胁中的重要一环。本文将探讨哪些类型的企业容易成为DDoS攻击的目标&#xff0c;并提出相应的防范策略&#xff0c;帮助企业更好地保护自身网络安全。 一、电子商务平台 电子商务平台作为线上交易和支付的重要场…

一文了解JVM(中)

HotSpot 虚拟机对象探秘 对象的创建 Header解释使用 new 关键字调用了构造函数使用 Class 的 newInstance 方法调用了构造函数使用 Constructor 类的newInstance 方法调用了构造函数使用 clone 方法没有调用构造函数使用反序列化没有调用构造函数说到对象的创建,首先让我们看…

6个迹象表明你的电脑电缆管理很糟糕,看下你有没有中招

​清理电脑内部的电缆可能看起来像是徒劳的忙碌。毕竟,如果一切都正常,为什么还要麻烦呢?好吧,我有六个很好的理由可以说服你打开你的机箱,修复你电脑里的混乱。 你很难打开侧板 如果你的电缆离侧板的边缘太近,你将无法毫不费力地将它们滑开。虽然这不是你每天都要做的…

数据结构——图论详细笔记

一 图论基本概念 Directed Acyclic Graph &#xff08;DAG&#xff09; 二 图的存储 ①邻接矩阵(适用于稠密图) ②邻接表(适用于稀疏图) 三、图的遍历 ①深度优先搜索 //(基于邻接表实现&#xff0c;以有向图为例) //DFS:Depth First Search 深度优先搜索 //1、访问起始顶点 …

为什么要开发盲盒小程序?商家企业的盈利方向?

近几年&#xff0c;盲盒已经成为了一种娱乐消费的流行趋势&#xff0c;受到了年轻人的喜欢&#xff0c;推动了盲盒经济的快速发展。在互联网的支持下&#xff0c;盲盒行业也获得了数字化发展&#xff0c;盲盒小程序为市场创新发展提供了重要动力。在当下小程序快速发展的时代&a…

【C++修行之道】类和对象(四)运算符重载

目录 一、 运算符重载 函数重载和运算符重载有什么关系&#xff1f; 二、.*运算符的作用 三、运算符重载的正常使用 四、重载成成员函数 五、赋值运算符重载 1.赋值运算符重载格式 传值返回和引用返回 有没有办法不生成拷贝&#xff1f; 2. 赋值运算符只能重载成类的…

MongoDB CRUD操作:可重试写入

MongoDB CRUD操作&#xff1a;可重试写入 文章目录 MongoDB CRUD操作&#xff1a;可重试写入使用的先决条件部署的限制支持的存储引擎3.6 MongoDB 驱动程序MongoDB 版本写确认 可重试写入和多文档事务启用可重试写入MongoDB驱动mongosh 可重试的写操作行为持续的网络错误故障切…

Linux如何远程连接服务器?

远程连接服务器是当代计算机技术中一个非常重要的功能&#xff0c;在各种领域都有广泛的应用。本文将重点介绍如何使用Linux系统进行远程连接服务器操作。 SSH协议 远程连接服务器最常用的方式是使用SSH&#xff08;Secure Shell&#xff09;协议。SSH是一种网络协议&#xff…

Java常规题技术分享

一、数组排序和添加成员 设计类Student和类StudentClass。 (1) 类Student有字符串属性name、double属性grade和int属性age 有带参数的构造方法&#xff0c;可设置三个属性的值 有各个属性的置取方法 (2)类StudentClass有Student数组属性stus存放班级成员&#xff0c;有int…

「不只是框架:Django REST framework的超能力大揭秘」

想要让你的API服务像五星级餐厅一样令人难忘吗&#xff1f;今天阿佑将为你揭晓&#xff01;从基础的RESTful原则到Django REST framework的高级特性&#xff0c;我们一步步带你走进API开发的后厨&#xff0c;展示如何准备食材&#xff08;数据模型&#xff09;、调制酱料&#…

揭秘GPU技术新趋势:从虚拟化到池化

从GPU虚拟化到池化 大模型兴起加剧GPU算力需求&#xff0c;企业面临GPU资源有限且利用率不高的挑战。为打破这一瓶颈&#xff0c;实现GPU算力资源均衡与国产化替代&#xff0c;GPU算力池化成为关键。本文深入探讨GPU设备虚拟化途径、共享方案及云原生实现&#xff0c;旨在优化资…

yolov5模型结构与构建原理

一.yolov5模型结构与构建原理 修改模型结构&#xff0c;全部在models文件夹下面 models/common.py &#xff08;加入新增网络细节&#xff09; models/yolo.py &#xff08;设定网络结构传参细节&#xff09; models/##.yaml &#xff08;修改模型结构配置文…

kill 不管用时,类型为C

当使用nvidia-smi时看到类型为C的进程时&#xff0c;使用 kill -9 PID&#xff0c;却不管用&#xff0c;这时需要先使用如下命令&#xff0c;找出运行的脚本对应的所有PID: ps -aux | grep train.py 接着就会把train.py对应运行的进程全部展示出来&#xff1a; 接着就是使用 …

景源畅信电商:抖音小店怎么做好运营?

在如今这个数字化时代&#xff0c;电商平台如雨后春笋般涌现&#xff0c;其中抖音小店以其独特的短视频营销模式迅速崛起。如何在这个竞争激烈的市场中占据一席之地&#xff0c;成为了许多商家和创业者思考的问题。下面&#xff0c;我们将深入探讨抖音小店的运营策略&#xff0…

Qt——控件

目录 概念 QWidget核心属性 enabled geometry WindowFrame的影响 windowTitle windowIcon qrc的使用 windowOpacity cursor font toolTip focusPolicy ​编辑 styleSheet 按钮类控件 PushButton RadioButton CheckBox 显示类控件 Label textFormat pixm…

MongoDB CRUD操作:地理位置应用——通过地理空间查询查找餐厅

MongoDB CRUD操作&#xff1a;地理位置应用——通过地理空间查询查找餐厅 文章目录 MongoDB CRUD操作&#xff1a;地理位置应用——通过地理空间查询查找餐厅地图的扭曲搜索餐厅浏览数据查找当前邻居查找附近所有餐厅查找一定距离内的餐厅使用$geoWithin&#xff0c;不排序使用…