13.在 Vue 3 中使用 ECharts 实现桑基图

ops/2025/1/21 20:14:08/
1. 前言

桑基图是一种用于直观显示流向数据的可视化工具,特别适合展示复杂的网络关系和资源流动。在前端项目中,通过结合 Vue 3 和 ECharts,可以快速实现交互性强、样式美观的桑基图。本文将通过完整的代码示例,带你一步步完成一个桑基图的实现。


2. 项目准备
2.1 安装必要的依赖

在 Vue 3 项目中使用 ECharts,首先需要安装 ECharts 包:

javascript">npm install echarts
2.2 创建项目结构

在项目中创建一个组件文件,例如 SankeyChart.vue,用于封装桑基图的实现逻辑和展示。


3. 代码实现

以下是完整的代码实现,包括模板、脚本和样式。

javascript"><!--* @Author: 彭麒* @Date: 2025/1/20* @Email: 1062470959@qq.com* @Description: 此源码版权归吉檀迦俐所有,可供学习和借鉴或商用。-->
<template><div class="w-full justify-start flex h-[180px] items-center pl-10"><BackButton @click="goBack"/></div><div class="font-bold text-[24px]">在Vue3中使用Echarts实现桑基图</div><div class="chart-container"><div ref="chartRef" class="sankey-chart"></div></div>
</template><script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue'
import * as echarts from 'echarts'
import BackButton from "@/views/components/BackButton.vue";
import router from "@/router";
const goBack = () => {setTimeout(() => {router.push('/Echarts')}, 1000)
}
const chartRef = ref<HTMLElement | null>(null)
let chart: echarts.ECharts | null = nullconst initChart = () => {if (!chartRef.value) returnchart = echarts.init(chartRef.value)const option = {color: ['#7BC074', '#709EF1', '#F59363'],series: [{type: 'sankey',draggable: false,left: '8%',right: '8%',data: [// 左点{ name: '安徽', label: { position: 'left' } },{ name: '广西', label: { position: 'left' } },{ name: '江西', label: { position: 'left' } },{ name: '青海', label: { position: 'left' } },{ name: '湖南', label: { position: 'left' } },{ name: '四川', label: { position: 'left' } },{ name: '湖北', label: { position: 'left' } },// 右点{ name: '江苏 ', label: { position: 'right' } },{ name: '广东 ', label: { position: 'right' } },{ name: '浙江 ', label: { position: 'right' } },{ name: '重庆', label: { position: 'right' } }],links: [{ source: '安徽', target: '江苏 ', value: 18.68 },{ source: '安徽', target: '浙江 ', value: 12.38 },{ source: '广西', target: '广东 ', value: 30.36 },{ source: '江西', target: '广东 ', value: 12.48 },{ source: '江西', target: '浙江 ', value: 12.67 },{ source: '青海', target: '广东 ', value: 13.47 },{ source: '青海', target: '浙江 ', value: 11.03 },{ source: '湖南', target: '广东 ', value: 19.11 },{ source: '四川', target: '重庆 ', value: 15.02 },{ source: '湖北', target: '广东 ', value: 11.66 }],label: {normal: {color: 'rgba(9, 27, 61, 0.6)',fontSize: 14,fontWeight: '400'}},itemStyle: {normal: {borderWidth: 1,borderColor: '#aaa'}},lineStyle: {normal: {color: 'gradient',borderColor: 'black',borderWidth: 0,opacity: 0.3,curveness: 0.6}}}]}chart.setOption(option)
}const handleResize = () => {chart?.resize()
}onMounted(() => {initChart()window.addEventListener('resize', handleResize)
})onUnmounted(() => {chart?.dispose()window.removeEventListener('resize', handleResize)
})
</script><style scoped>
.chart-container {width: 100%;height: 70%;min-height: 600px;background-color: #fff;
}.sankey-chart {width: 100%;height: 100%;
}@media screen and (max-width: 768px) {.chart-container {min-height: 400px;}
}@media screen and (max-width: 480px) {.chart-container {min-height: 300px;}
}
</style>

4. 运行效果

运行项目后,访问相应页面,即可看到一个动态的桑基图,展示了各省份之间的流向数据。


5. 功能扩展
  1. 数据动态更新

    • 将图表数据通过 API 获取,并动态更新图表内容。
    • 示例:
      javascript">chart.setOption({ series: [{ data: newData, links: newLinks }] });
  2. 交互功能

    • 添加鼠标悬停事件,展示详细信息。
    • 使用 tooltip 配置实现:
      javascript">tooltip: { trigger: 'item', formatter: '{b}: {c}', }

6. 总结

本文通过完整的代码示例,展示了如何使用 Vue 3 和 ECharts 实现桑基图。从项目搭建到细节优化,都进行了详细讲解。希望这篇文章对你有所帮助!

参考资料

  • ECharts 官方文档
  • Vue 3 官方文档

欢迎留言交流,如果你有更好的思路或实现方式,也欢迎分享! 😊


http://www.ppmy.cn/ops/151995.html

相关文章

Asp .Net Core实现微服务:使用 Nacos 实现配置管理和服务发现

官方示例&#xff1a;https://kgithub.com/nacos-group/nacos-sdk-csharp 安装 Nuget 包 dotnet add package nacos-sdk-csharp.AspNetCore dotnet add package nacos-sdk-csharp.Extensions.Configuration配置 appsettings.json {"Nacos": {"ServerAddresse…

基于大数据的气象数据分析与可视化系统设计与实现【爬虫海量数据,LSTM预测】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍研究目的研究意义研究思路可视化展示每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 本课题主要针对气象数据进行分析以及可…

node.js 文件操作

在 Node.js 中&#xff0c;文件操作主要通过内置的 fs&#xff08;File System&#xff09;模块来实现。 1. 读取文件 const fs require("fs");// 异步读取文件fs.readFile("example.txt", "utf8", (err, data) > {if (err) {console.erro…

uniapp时间组件

导入链接: https://ext.dcloud.net.cn/plugin?id17926

Python----Python高级(模块与包,Python基本库)

一、模块 1.1、概念 就是一个包含了Python代码的以.py为后缀的Python文件&#xff0c;可以被其他 Python程序导入和使用&#xff0c;也可以自己独立执行&#xff0c;里面存放着的是一组相关的函 数或者类&#xff0c;比如查看关键字列表时导入的keyword模块。 1.2、作用 令Py…

洛谷 P2392 kkksc03考前临时抱佛脚 刷题笔记 dfs

P2392 kkksc03考前临时抱佛脚 - 洛谷 | 计算机科学教育新生态 题目分析 左右脑双核 当我们给左右脑各自分配一道题时 消耗的时间为两者中耗时较长的一道题 我们尝试把每一道题都分配给左右脑试一试 即可遍历所有答案 关键在于答案怎么取保证耗时最短 if(step>a[x])…

ingress-nginx代理tcp使其能外部访问mysql

一、helm部署mysql主从复制 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo updatehelm pull bitnami/mysql 解压后编辑values.yaml文件&#xff0c;修改如下&#xff08;storageclass已设置默认类&#xff09; 117 ## param architecture MySQL archit…

TCP断开通信前的四次挥手(为啥不是三次?)

1.四次握手的过程 客户端A发送 FIN&#xff08;终止连接请求&#xff09; A&#xff1a;我要断开连接了&#xff08;FIN&#xff09;。A进入FIN_WAIT_1状态&#xff0c;表示请求断开&#xff0c;等待对方确认。 服务器B回复 ACK&#xff08;确认断开请求&#xff0c;但还未准备…