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>

效果
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++11:列表初始化 初始化列表initializer_list

前言 2003年C标准委员会曾经提交了一份技术勘误表&#xff08;简称TC1&#xff09;&#xff0c;使得C03这个名字取代了C98成为了C11前最新的C标准名称。不过由于C03主要是对C98标准中的漏洞进行修复&#xff0c;语言的核心部分则没有改动&#xff0c;因此人们习惯性的把两个标准…

HiveQL性能调优-概览

一、铺垫 1、HiveQL 在执行时会转化为各种计算引擎的能够运行的算子&#xff0c;这里以mr引擎为切入点&#xff0c;要想让HiveQL 的效率更高&#xff0c;就要理解HiveQL 是如何转化为MapReduce任务的 2、hive是基于hadoop的&#xff0c;分布式引擎采用mr、spark、tze&#x…

游戏《酒店业领袖》

为快餐连锁店麦当劳&#xff0c;我们创建了一款名为“好客领袖”的游戏。麦当劳的员工可以在网站上注册&#xff0c;并测试自己是否扮演酒店领导的角色&#xff0c;在餐厅可能出现的各种情况下快速做出决定。奖品等待着那些在比赛中表现最好的人。 对于该项目&#xff0c;我们&…

反转链表的三种方法--面试必考(图例超详细解析,小白一看就会!!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐ 头插法 --- 创建新的链表 ⭐ 迭代法 --- 三指针 ⭐ 递归法 四、总结与提炼 五、共勉 一、前言 反转链表这道题&#xff0c;可以说是--链表专题--&#xff0c;最经典的一道题&#xff0c;也是在面试中频率最高的一道题目&…

在编程Python的时候发生ModuleNotFoundError: No module named distutils报错怎么办

1.先查看Python版本 首先我们先去打开终端就是先widr再输入cmd 然后进去在输入Python -V要注意大小写 我的版本是3.9.7版本但是我使用的PyCharm 是 2021.1.1 x64版本没有办法主动去识别因为这个版太低了你的Python版本很高所以无法识别 2.解决方法 只需要把你的Python现版…

矩阵链相乘(动态规划法)

问题分析 矩阵链相乘问题是一个经典的动态规划问题。给定一系列矩阵&#xff0c;目标是找到一种最优的乘法顺序&#xff0c;使得所有矩阵相乘所需的标量乘法次数最少。矩阵链相乘问题的关键在于利用动态规划来避免重复计算子问题。 算法设计 定义子问题&#xff1a;设 &…

作业6.6

练习1:用预处理指令#define声明一个常数&#xff0c;用于表明1年有多少秒?(不需要考虑润年) #define SECONDS_PER_YEAR (365 * 24 * 60 * 60) 练习2:如何判断一个数是unsigned格式 如果一个数是unsigned类型的&#xff0c;那么它总是大于等于0。因此&#xff0c;可以通过判断一…

Kruskal算法求最小生成树

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <assert.h> #define MAX 100 #define NO INT_MAX//NO表示没有边&#xff0c;相当于INFtypedef struct Graph {int arcnum;int vexnum;char vextex[MAX][20];int martrix[MAX][MA…

使用node将页面转为pdf?(puppeteer实现)

本文章适合win系统下实验&#xff08;linux&#xff0c;mac可能会出现些莫名其妙的bug我也不会解决&#xff09; 具体过程 首先了解什么时无头浏览器启动无头浏览器打开指定的url页面设置导出pdf格式开始转化完整基础代码 首先了解什么时无头浏览器 没有界面的浏览器下载pupp…

SLC Flash SD芯片:高性能存储的优选

SLC Flash SD芯片是一种采用单阶存储单元&#xff08;SingleLevel Cell&#xff0c;SLC&#xff09;技术的Secure Digital&#xff08;SD&#xff09;存储卡。SLC技术以其快速的传输速度、低功耗和较长的存储单元寿命而闻名。 MK米客方德 SLC Flash的优势 1. 快速的传输速度&a…

如何确定一段文字的语言?(语种识别模型推荐)

个人用下来&#xff0c;感觉fasttext很好用&#xff0c;相对比较准确。 https://pypi.org/project/fasttext-langdetect/

太阳能语音警示杆在户外的应用及其作用

一、太阳能语音警示杆的主要应用领域 交通管理&#xff1a;在城市道路、乡村公路、高速公路等交通要道&#xff0c;太阳能语音警示杆可以用于提醒驾驶员注意前方路况、减速慢行或者避让施工区域。例如&#xff0c;在临时施工路段&#xff0c;警示杆可以播放“前方施工&#xf…

Qt——升级系列(Level Two):Hello Qt 程序实现、项目文件解析、Qt 编程注意事项

Hello Qt 程序实现 使用“按钮”实现 纯代码方式实现&#xff1a; // Widget构造函数的实现 Widget::Widget(QWidget *parent): QWidget(parent) // 使用父类构造函数初始化QWidget&#xff0c;传入父窗口指针, ui(new Ui::Widget) // 创建Ui::Widget类的实例&#xff0c;并…

Qt图标字体文件中提取字体保存为图片

本文借用别人写的一个IconHelper来做说明。 1. 加载一个字体文件 QScopedPointer<IconHelper> iconHelper(new IconHelper(":/fa-regular-400.ttf", "Font Awesome 6 Pro Regular"));构造函数 IconHelper::IconHelper(const QString &fontFile…

大模型产品层出不穷,如何慧眼识珠?

先预祝亲爱的读者们“端午安康“ 大模型百花齐放&#xff0c;选择难上加难 面对眼前层出不穷的大模型产品&#xff0c;许多人会不禁感到困惑&#xff1a;哪个才是真正适合自己的爆款大模型?在中国本土 alone&#xff0c;就有百来个大模型产品&#xff0c;简直是五花八门&…

C语言指针介绍其二

指针运算 指针-整数 指针-整数有一个常见的作用&#xff1a;用指针打印数组的内容 int main() {int arr[10];int* p arr;for (int i 0; i < 10; i){arr[i] i;}for (size_t i 0; i < 10; i){printf("%d ", *(p i));} } 这里我们可以探索到许多方法&…

选择虚拟制作的三大理由!虚幻引擎制作 vs 传统影视制作

影视制作一直是一个充满创意但耗时复杂的过程&#xff0c;通常以线性方式进行。然而&#xff0c;随着虚幻引擎5的不断完善&#xff0c;越来越多的影视制作人开始拥抱虚幻引擎制作所带来的灵活性和艺术自由。近年来&#xff0c;一些备受瞩目的影视作品&#xff0c;如&#xff1a…

现代社区管理中的电瓶车违停检测技术

随着城市化进程的加快&#xff0c;电瓶车作为一种环保、便捷的出行工具在社区内的使用越来越普及。然而&#xff0c;电瓶车的随意停放问题也日益严重&#xff0c;影响了社区的整体环境和居民的生活质量。为了解决这一问题&#xff0c;社区管理者迫切需要一种高效、准确的电瓶车…

【Vue】项目目录介绍和运行流程

文章目录 一、项目目录介绍二、public/index.html三、src/main.js四、运行流程 一、项目目录介绍 虽然脚手架中的文件有很多&#xff0c;目前咱们只需认识三个文件即可&#xff0c;这三个文件就决定了我们项目的运行 main.js 入口文件App.vue App根组件index.html 模板文件 我…

course-nlp——6-rnn-english-numbers

本文参考自https://github.com/fastai/course-nlp。 使用 RNN 预测数字的英文单词版本 在上一课中&#xff0c;我们将 RNN 用作语言模型的一部分。今天&#xff0c;我们将深入了解 RNN 是什么以及它们如何工作。我们将使用尝试预测数字的英文单词版本的问题来实现这一点。 让…