vue+echarts实现桑吉图的效果

news2024/11/26 17:23:09

前言:

        在我们项目使用图形的情况下,桑吉图算是冷门的图形了,但是它可以实现我们对多级数据之间数据流向更好的展示的需求,比如,我们实际数据流向中,具有1对多,多对多的情况下,如果用tree是不合适,用思维导图的话,只能实现线路的展示,达不到我们想对数据可视化的需要。

实现效果:

实现代码:

1、初始化调用方法

echarts挂载点击事件: radarChart.getZr().on

echarts随着界面的变动自动适应:window.onresize

源码:

let chartDom = document.getElementById("radar")
let radarChart = echarts.init(chartDom)

//配置属性值
 radarChart.setOption(option.value)

//挂载点击事件
  radarChart.getZr().on("click", event=> {
    // 第三层文字点击事件
    if (event.topTarget?.type === "tspan") {
          const text = event.topTarget.style.text
          if(text.indexOf('/') !== -1){
            console.log(event);
            console.log(text);
          }
    }
  })

//让echarts随着界面的变动自动适应
window.onresize = () => {
    radarEcharts.resize()
  }

2、配置属性

注意1:echarts通用的用网格的方法添加内边距,在桑吉图是无效的

grid: {
  top: "0",
  left: "10%",
  right: "10%",
  bottom: "0",
  containLabel: true,
}

//  桑吉图中添加内边距的特殊方法

series: {
      type: "sankey",
      top: "1%",           // 距离上 距离
      bottom: "1%",      // 距离下 距离
      left: "0",                  // 距离左 距离
      right: "16.5%",          // 距离右 距离

...

注意2:桑吉图中文字内容是可以自定义的,但是排版是固定的,不会自定义生成距离

注意3:桑吉图的数据中通过  depth  这个字段来控制他是第几层

源码:

option.value = {
    tooltip: {
      trigger: "item",
      triggerOn: "mousemove",
      rich: {
        "a": {
          "fontSize": 14,
          "fontWeight": 500,
          'color':'#fff',
          padding: [0, 0, 5, 0],
        }
      },
    // 鼠标滑上去的展示信息
      formatter: function(params) {
        if (params.data.source) {
          return `${params.data.source}-${params.data.target}:${params.data.value}`;
        } else {
          return `${params.name}:${params.value}`;
        }
      }
    },
    series: {
      type: "sankey",
      layout: "none",
      top: "1%",
      bottom: "1%",
      left: "0",
      right: "16.5%",
      draggable: false,
      focusNodeAdjacency: 'allEdges', // 鼠标划上时高亮的节点和连线,allEdges表示鼠标划到节点上点亮节点上的连线及连线对应的节点
      lineStyle: {
        opacity: 0.3,
        color: "gradient",
        curveness: 0.7,
      },
      label: {
        color: "#000",
        fontSize: 15,
        formatter: function (params) {
          // 一级 硕士研究生 博士研究生
          if(params.data.depth === 0 && params.data.name==='本科生') return "{a|" + params.data.name + "\n}" +"{b|" + params.data.value+ "}";
          if(params.data.depth === 0 && params.data.name==='硕士研究生') return "{a2|" + params.data.name + "\n}" +"{b2|" + params.data.value+ "}";
          if(params.data.depth === 0 && params.data.name==='博士研究生') return "{a3|" + params.data.name + "\n}" +"{b3|" + params.data.value+ "}";
          // 二级
          if(params.data.depth === 1) return "{c|" + params.data.name + "}" +"{d|" + params.data.value+ "}";
          // 三级
          if(params.data.depth === 2){
            let str = ''
            params.data.typeArr.forEach(item=>{
              // str += "{e|" + params.data.name + "/"+ item.typeName +"\n}"+"{f|" + item.value+ "\n}"
              str += "{m|" + params.data.name + "/"+ item.typeName +"}"+"{n|" + item.value+ "\n}"
            })
            return str;
          }

        },
        rich: {
          "a": {
            "fontSize": 14,
            "fontWeight": 500,
            'color':'#7BA2DF',
            padding: [0, 0, 5, 0],
          },
          "b": {
            "fontSize": 24,
            "fontWeight": 600,
            'color':'#7BA2DF',
            padding: [0, 0, 0, 0],
          },
          "a2": {
            "fontSize": 14,
            "fontWeight": 500,
            'color':'#BA86ED',
            padding: [0, 0, 5, 0],
          },
          "b2": {
            "fontSize": 24,
            "fontWeight": 600,
            'color':'#BA86ED',
            padding: [0, 0, 0, 0],
          },
          "a3": {
            "fontSize": 14,
            "fontWeight": 500,
            'color':'#59DEC6',
            padding: [0, 0, 5, 0],
          },
          "b3": {
            "fontSize": 24,
            "fontWeight": 600,
            'color':'#59DEC6',
            padding: [0, 0, 0, 0],
          },
          "c": {
            "fontSize": 16,
            "color": "#332D2D",
            "lineHeight": 20,
          },
          "d": {
            "fontSize": 16,
            "fontWeight": 600,
            "lineHeight": 20,
            "color": "#332D2D ",
            padding: [0, 0, 0, 2],
          },
          "e": {
            "fontSize": 14,
            "fontWeight": 500,
            'color':'#332D2D',
            padding: [0, 0, 5, 0],
          },
          "f": {
            "fontSize": 16,
            "fontWeight": 600,
            'color':'#332D2D',
            padding: [0, 0, 20, 0],
          },
          "m": {
            "fontSize": 14,
            "fontWeight": 500,
            'color':'#332D2D',
            padding: [0, 0, 0, 0],
          },
          "n": {
            "fontSize": 16,
            "fontWeight": 600,
            'color':'#332D2D',
            padding: [0, 0, 0, 10],
          },
        },
      },
      // nodeWidth:100,
      nodeGap: 20, // 每一组之间的距离
      layoutIterations: 0,// 自动优化列表,尽量减少线的交叉,为0就是按照数据排列
      emphasis: {
        focus: "adjacency",
      },
      data: allData,
      links: allGuideData,
    },
  }

3、测试数据填入:

// 测试数据1
  let allData= [
    { name: "本科生",value:430, itemStyle: { color: "#7BA2DF" }, depth: 0 },
    { name: "硕士研究生",value:60, itemStyle: { color: "#BA86ED" }, depth: 0 },
    { name: "博士研究生",value:60, itemStyle: { color: '#59DEC6' }, depth: 0 },
    { name: "预防医学",value:60, itemStyle: { color: '#5FD981' }, depth: 1 },
    { name: "综合楼",value:60, itemStyle: { color: "#00baff" }, depth: 1 },
    { name: "2022级",typeArr:[{typeName:"本科",value:50},{typeName:"硕士研究生",value:30}], itemStyle: { color: "#f8b551" }, depth: 2 },
    { name: "2021级",typeArr:[{typeName:"硕士研究生",value:50}], itemStyle: { color: "#7ecef4" }, depth: 2 },
    { name: "2023级",typeArr:[{typeName:"博士研究生",value:50}], itemStyle: { color: "#7ecef4" }, depth: 2 },
  ]

  // 测试数据2,连线
  let allGuideData = [
    // L1→L3	 4509
    { source: "本科生", target: "预防医学", value: 800 },
    // L2→L3	 12196
    { source: "硕士研究生", target: "预防医学", value: 200 },
    // L1→L2→L3	 2404
    { source: "综合楼", target: "2022级", value: 200 },
    { source: "综合楼", target: "2023级", value: 200 },
    { source: "博士研究生", target: "2022级", value: 300 },
    { source: "预防医学", target: "2021级", value: 400 },
    { source: "预防医学", target: "2023级", value: 100 },
  ]

4、更多,官方api:

官方api有关桑吉图apiicon-default.png?t=N7T8https://echarts.apache.org/zh/option.html#series-sankey.type

更多桑吉图资料icon-default.png?t=N7T8https://www.ppchart.com/#/

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

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

相关文章

2023年淘宝天猫年终惊喜红包玩法

2023年淘宝天猫年终惊喜红包玩法,2023年淘宝年终好价节红包活动 随着2023年的尾声渐近,淘宝再次为广大用户带来了年终的惊喜——一场特别的红包活动。从12月8日零时开始,直至12月12日的午夜,淘宝app将开启一个为期五天的年终好价节…

Web前端工程的装机必备软件

前言 最近作者的电脑 C 盘变红了,这让我很难受(有点小强迫症),所以准备重新安装下系统,顺便把 C 盘扩大点。 注意: 操作系统是 windows 11 23H2。 所有的命令行都是使用 Windows Terminal 中进行的。 安装 Windows Terminal 由于…

L1-026:I Love GPLT

题目描述 这道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。 所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。 输入样例: 无输出样…

arm 交叉编译器版本下载

网址:https://releases.linaro.org/components/toolchain/binaries/ 根据板子架构选择正确的编译器 根据你主机架构选择对应的版本(就是你的开发电脑架构)

ROS小练习——服务调用

目录 一、服务名称与消息的获取 二、代码案例 1、C 2、python 三、编译运行 1、配置cmakelist 2、运行 一、服务名称与消息的获取 rosservice list rosservice type /spawn rossrv info turtlesim/Spawn 二、代码案例 1、C //包含头文件 #include "ros/ros.h&qu…

Linux AMH服务器管理面板本地安装与远程访问

最近,我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念,而且内容风趣幽默。我觉得它对大家可能会有所帮助,所以我在此分享。点击这里跳转到网站。 文章目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装…

MySQL和MongoDB简介以及它们之间的区别

本文主要介绍MySQL和MongoDB的简介以及它们之间的区别。 目录 MySQL简介MySQL的优缺点MySQL的应用场景MongoDB简介MongoDB的优缺点MongoDB的应用场景MySQL和MongoDB的区别 MySQL简介 MySQL是一种开源的关系型数据库管理系统,是世界上最流行的数据库之一。它支持多用…

UVM:UVM的树形结构

UVM采用树形的组织结构来管理验证平台的各个部分。sequencer、driver、monitor、agent、model、 scoreboard、env等都是树的一个结点。为什么要用树的形式来组织呢?因为作为一个验证平台,它必须能够掌握自己治下的所 有“人口”,只有这样做了…

温度而知新,一文读懂Java知识文集精华版。

🏆作者简介,普修罗双战士,一直追求不断学习和成长,在技术的道路上持续探索和实践。 🏆多年互联网行业从业经验,历任核心研发工程师,项目技术负责人。 🎉欢迎 👍点赞✍评论…

SL1581降压恒压 耐压4V-30V降压5V 2A电流 外围简单,四个元器件

SL1581是一款专为降压恒压应用而设计的芯片,具有耐压4V-30V、降压5V、2A电流输出等特点,外围电路简单,仅需四个元器件。 一、芯片介绍 SL1581是一款专为降压恒压应用而设计的芯片,它采用先进的PWM控制技术,具有高效率、…

Google 发布最强大模型Gemini,能力与GPT-4相当

一、Gemini 介绍 Gemini 是一个多模式模型系列,在图像、音频、视频和文本领域展示了真正强大的功能。其中功能最强大的模型 Gemini Ultra 在 32 个基准测试中的 30 个中提升了最先进水平,其中包括 12 个流行文本和推理基准测试中的 10 个、9 个图像理解…

情感分析简化:使用python中的TextBlob库轻松分析文本情感

导语:在当今社交媒体和大数据时代,了解人们对于产品、服务或事件的情感倾向变得至关重要。TextBlob库作为一个简单易用的自然语言处理工具,提供了强大的情感分析功能,帮助我们更深入地理解文本背后的情感。本文将介绍TextBlob库的…

Python3+RIDE+RobotFramework自动化测试框架搭建过程详解

一、Python安装 最新版Python下载地址:https://www.python.org/ 根据操作系统选择对应版本制品下载安装即可,本机用的是Windows x86-64 executable installer。 注意事项: 安装完成后检查下环境变量,默认会配置好,可…

HarmonyOS开发(十):通知和提醒

1、通知概述 1.1、简介 应用可以通过通知接口发送通知消息,终端用户可以通过通知栏查看通知内容,也可以点击通知来打开应用。 通知使用的的常见场景: 显示接收到的短消息、即使消息...显示应用推送消息显示当前正在进行的事件&#xff0c…

2024黑龙江省职业院校技能大赛信息安全管理与评估赛项规程

2024黑龙江省职业院校技能大赛暨国赛选拔赛 “GZ032信息安全管理与评估”赛项规程 极安云科专注技能竞赛,包含网络建设与运维和信息安全管理与评估两大赛项,及各大CTF,基于两大赛项提供全面的系统性培训,拥有完整的培训体系。团队…

Python实现广义线性回归模型(statsmodels GLM算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 广义线性模型(Generalized Linear Model,简称GLM)是一种广泛应用于回归分析和分类问题的统…

中通快递查询,中通快递单号查询,筛选出指定派件员的单号

批量查询中通快递单号的物流信息,将指定派件员的单号筛选出来。 所需工具: 一个【快递批量查询高手】软件 中通快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,并登录 步骤2:点击主界面左上…

工业交换机的内部结构和工作原理,你了解多少?

工业交换机由许多小组件构造而成,因此,为了更全面地了解和认识工业交换机,我们需要了解其内部结构和工作原理。 工业交换机的内部结构: 1、主板,也被称为背板,是计算机的核心部件之一。 为各业务接口和数…

【PyTorch】模型选择、欠拟合和过拟合

文章目录 1. 理论介绍2. 实例解析2.1. 实例描述2.2. 代码实现2.2.1. 完整代码2.2.2. 输出结果 1. 理论介绍 将模型在训练数据上拟合的比在潜在分布中更接近的现象称为过拟合, 用于对抗过拟合的技术称为正则化。训练误差和验证误差都很严重, 但它们之间差…

DELL EMC unity 存储系统日志收集方法

对于一些非简单的硬件故障,解决故障最有效、最快速的方法就是收集日志,而不是瞎搞。常见的乱搞方法就是 1. reimage系统‘ 2. 更换控制器;3, 重启。 本文详细介绍了图形界面GUI和命令行CLI下如何收集DELL EMC Unity日志的方法和常…