基于echarts桑基图改造的数据流向

2023-10-20 06:20

本文主要是介绍基于echarts桑基图改造的数据流向,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近出了个需求,要求做一个数据流向的图表。

根据数据结构特点:数据可以通过多个节点开始流入,最终可以流向多个节点。根据这个特点,满足要求的有两个:一个是关系图,另一个是桑基图。再根据各节点的排列位置来看,桑基图是最接近的了

但是设计师觉得桑基图的样式不好看,所以要基于桑基图来调整。

一般的桑基图是这样的

在阅读echarts的桑基图的文档之后,节点的高度是自动的,宽度可以设置,但是只能统一设置,不能对节点单独设置。这样的比较麻烦了,不太好自定义了。

但是,echarts还有个label属性,我们可以通过echarts的label的富文本属性来自定义节点的样式【太妙了】 

下面直接上代码:

(这里的代码的主要终点就是对node的label的设置,已经link的lineStyle的设置,其他的根绝自己的需求调整即可)

使用的技术栈:vue3.0 + ts

function handleInitEchart(data: any[], links: any[]) {const nodesMap: any = {}, linksCountMap: any = {};const colors: any = ["#1C4BA0","#F99F46","#F4654E","#5A2EF7","#0086FF","#FF6600","#FF6666",];const bigColor: any = ["#336699","#FF6600","#990033","#FF6666","#009966","#CC6600","#003366","#CC3333","#006699","#FFCCCC",];for (let i = 0; i < links.length; i++) {let item = links[i];if (!linksCountMap[item.target]) {linksCountMap[item.target] = [item.source];} else {linksCountMap[item.target].push(item.source);}}links.forEach((item: any) => {if (linksCountMap[item.target].includes(item.source)) {item.value = parseInt((60 / linksCountMap[item.target].length) as any);} else {item.value = 10;}if (item.value > 10) {item.value = 10;}Object.assign(item, {lineStyle: {color: new echarts.graphic.LinearGradient(0, 0, 1, 0, [{offset: 0,color: colors[item.level - 1],},{offset: 1,color: colors[item.level],},]),},});});for (let i = 0; i < data.length; i++) {data[i].count = data[i].value;}data.forEach((item: any, idx: number) => {if (!nodesMap[item.level]) {nodesMap[item.level] = [item];} else {nodesMap[item.level].push(item);}item.value = 30;item.name = "节点名称" + idx;let offsetY = 8;let padding = [4, 10],color = colors[item.level - 1];if (item.level == "1") {if (item.count > 5000000) {item.value = 28;padding = [10, 10];offsetY = 8;let colori = parseInt((Math.random() * 7) as any);color = bigColor[colori];} else {item.value = 16;padding = [4, 10];offsetY = 4;}} else {item.value = 60;padding = [17, 10];offsetY = 20;if (linksCountMap[item.id].length > 3) {offsetY = 0;}}Object.assign(item, {level: item.level,nodeWidth: 270,label: {offset: [0, -offsetY],width: 247,show: true,position: "inside",padding: padding,borderColor: color,borderWidth: 1,borderRadius: 4,borderType: "solid",backgroundColor: color,fontSize: item.level == "1" ? 12 : 20,formatter(e: any) {if (item.level == "1") {return `{a|${e.data.name}}{b|${e.data.count}}`;} else {return `{c|${e.data.name}}\n{d|${e.data.count}}`;}},},});});const option = {series: [{type: "sankey",left: 20,top: 20,right: 20,bottom: 20,data: data,links: links,nodeWidth: 270,draggable: false,focusNodeAdjacency: "allEdges",lineStyle: {color: "source",curveness: 0.5,},itemStyle: {color: "transparent",borderColor: "transparent",},label1: {position: "inside",fontSize: 12,color: "#666",formatter: function (params: any) {let { data } = params;return data.name;},},label: {position: "inside",show: true,color: "#fff",fontSize: 12,rich: {a: {width: 200,align: "left",color: "#fff",},b: {color: "#fff",align: "right",},c: {width: 200,fontSize: 24,align: "center",},d: {fontSize: 24,align: "center",},},},},],tooltip: {trigger: "item",},};echartsOptions.value = option;}

 最终的效果图:

 

这篇关于基于echarts桑基图改造的数据流向的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/245242

相关文章

数据流与Bitmap之间相互转换

把获得的数据流转换成一副图片(Bitmap) 其原理就是把获得倒的数据流序列化到内存中,然后经过加工,在把数据从内存中反序列化出来就行了。 难点就是在如何实现加工。因为Bitmap有一个专有的格式,我们常称这个格式为数据头。加工的过程就是要把这个数据头与我们之前获得的数据流合并起来。(也就是要把这个头加入到我们之前获得的数据流的前面)      那么这个头是

微信小程序(一)数据流与数据绑定

一、单向数据流和双向数据流 1、单项数据流:指的是我们先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里面 优点:数据跟踪方便,流向单一,追寻问题比较方便【主要体现:微信小程序】。 缺点:就是写起来不太方便,如果修改UI界面数据需要维护对应的model对象 2、双向数据流:值和UI是双向绑定的,大家都知道,只要UI里面的值发生

Echarts使用笔记--饼图,柱状图

开始做前端了,感觉自己是要变成全栈工程师了。。。 今天使用了echart,用之前觉得好高大上好厉害,肯定很复杂。用了以后才发现,使用起来超简单,当然,精通很难,里面的各种配置太多了,本文记录一下自己用到的东西。 echart使用 现在直接引用js文件就可以了 <script src="echarts.min.js"></script> echart组件需要在一个宽高固定的DOM里才能显示

【python web】Flask+Echarts 实现动图图表

flask 是python web开发的微框架,Echarts酷炫的功能主要是javascript起作用,将两者结合起来,发挥的作用更大。下面将Echarts嵌套进Flask的html模板中。 项目结构: 打开demo.py运行,点击console中的链接http://127.0.0.1:5000/ 就可以看到我们想要的动态图表。 demo.py #coding:utf-8fro

改造了一个流量阈值自动关机的脚本

改造后的脚本地址:https://raw.githubusercontent.com/BiuBIu-Ka/traffic_monitor/main/main.sh 优化的问题: 优化脚本运行多次会一直叠加流量的问题优化服务器重启后流量记录值清空的问题增加一个小日志系统 wget https://raw.githubusercontent.com/BiuBIu-Ka/traffic_monit

echarts 多个3D柱状图

图片样式: 代码实现: <template><div :class="className" :style="{height:height,width:width}" /></template><script>require("echarts/theme/sakura"); // echarts themeexport default {props: {className: {typ

【Godot4.3】CanvasShape资源化改造

概述 通过把之前自定义的CanvasShape类变成资源类型,将可以同时用于CanvasItem绘图和创建扩展的Node2D和Polygon2D节点等。 本篇就完成CanvasShape类的资源化改造,并记录改造过程和思路。 CanvasShape资源类型体系 CanvasShape仍然为图形基类,提供共有的属性和方法,只不过改为继承自Resource,成为自定义资源类型CanvasX

基于echarts车辆大数据综合分析平台

0.序言 基于ECharts的大数据综合分析平台技术框架与基本原理 技术框架 基于ECharts的大数据综合分析平台是一个集数据收集、处理、分析及可视化展示于一体的综合性系统。其技术框架主要可以分为以下几个层次: 数据源层: 数据收集:通过各种数据收集工具(如日志收集器、数据库同步工具等)从多个数据源(如关系型数据库、NoSQL数据库、日志文件、API接口等)收集数据。数据存储:将收集到的

无需更换摄像头,无需施工改造,降低智能化升级成本的智慧工业开源了。

智慧工业视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。 项目搭建地址 项目开源地址:yihecode-server 本项目基于ai场景而开发,提供算法模型管理、摄像头管

echarts进度

echarts图表集 let numdata=["I级",'II级','III级','IV级','V级','劣V级']let pricedata=40option = {backgroundColor: '#0f375f',title: {show: false,text: '',left: 'center',top: '30%',textStyle: {color: '#00D5FF