☰
ECharts关系图从入门到实践:解析RAR示例与数据可视化
2026/10/30 18:58:05 网站建设 项目流程

简介:这是一份面向数据可视化与大屏展示场景的ECharts关系图示例资源,适合前端开发者、数据分析师以及需要呈现社交网络、组织架构、网络拓扑等复杂关系结构的工程人员。压缩包共3个文件,包含2个JavaScript文件和1个HTML页面,整体约970KB。其中JS文件承担了ECharts初始化、关系图数据组织与布局配置等核心逻辑,HTML页面作为展示入口可直接在浏览器中打开预览,便于快速看到图表效果并对照学习。资源中还涉及力导向布局、圆形布局、节点形状与颜色、连线样式定制,以及拖拽、缩放、点击节点查看详情等交互功能,能帮助开发者理解如何将静态关系数据转化为可探索的动态可视化界面。已有102人学习和下载,整体体量轻、结构清晰,既可作为快速上手的参考样例,也能在项目中直接复用或扩展,进一步用于大屏实时数据监控与分析。

1. 拿到 ECharts关系图-关系图20.rar,先想清楚你要的是示例还是方案

ECharts 关系图(graph)是数据可视化里最容易让人眼前一亮的图表类型,社交网络、知识图谱、组织架构、数据库表关系都能用它画。ECharts关系图-关系图20.rar这类压缩包,一般是从 ECharts 社区或资源站整理下来的关系图示例代码合集,里面要么是 20 个关系图变体,要么是某个关系图项目第 20 版。对刚接触的人来说,解压后最大的困惑是:代码能跑,但不知道怎么改成自己的数据。这篇文章讲清楚关系图背后的数据结构、最小运行方式、关键参数和踩坑点,让你拿到手后能把它改造成自己的业务可视化。

2. 关系图的数据结构:nodes、links、categories 是怎样串起来的

关系图能不能跑通,七分看数据结构,三分看配置。ECharts 的 graph 系列接受三个顶层数组:nodes定义节点,links定义节点之间的连线,categories给节点分组归类。很多人在 RAR 示例里看到一长串配置就发怵,其实把这三个数组搞明白,剩下的都是锦上添花。

2.1 关系图选型:为什么用 ECharts 而不是纯 D3 或 AntV

ECharts 关系图本质上是把"节点-连线"这种图结构画到 Canvas 上。相比 D3 自己操作 SVG 逐个 append 节点,ECharts 把力导向布局、缩放拖拽、标签避让这些高频需求封装成了配置项。如果需求是一个能交互的关系图,ECharts 是上手成本最低的。AntV G6 也很强,但它的 API 思路偏向图分析,学习曲线比 ECharts 陡。我的经验是:不需要路径查找、环检测等图算法,只做展示和轻交互,无脑选 ECharts。

ECharts 关系图在 echarts 数据可视化生态里属于中等偏上的复杂度,它的核心不是配置多,而是数据结构必须正确。先用一个最小示例把它跑起来,再一层层加配置,比直接背参数有效得多。下面这个例子不依赖任何后端,一个 HTML 文件就能在浏览器里画出三个人之间的关联关系。

2.2 最小可运行示例:一个 HTML 文件画出最基本的关系网

先看最小可运行的代码。创建一个 HTML 文件,通过 CDN 引入 ECharts:

<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>最小关系图示例</title> <script src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script> </head> <body> <div id="graph" style="width: 800px; height: 600px;"></div> <script> const chart = echarts.init(document.getElementById('graph')); const option = { series: [{ type: 'graph', layout: 'force', data: [ { name: '张工', symbolSize: 40 }, { name: '李工', symbolSize: 30 }, { name: '王工', symbolSize: 30 } ], links: [ { source: '张工', target: '李工' }, { source: '张工', target: '王工' } ], label: { show: true, position: 'right' } }] }; chart.setOption(option); </script> </body> </html>

这段代码的逻辑是:先用echarts.init绑定容器 DOM,再构造一个option。data数组里每个对象是一个节点,必须有name作为唯一标识;links数组里每一项是一条边,source和target必须对应data里的name,这是新手最容易翻车的地方——名称对不上边就画不出来,而且 ECharts 不会报错,只会悄悄丢边。layout: 'force'表示用力导向布局,让节点自动散开;symbolSize直接写在节点数据里,控制节点圆的大小。把文件拖进浏览器,只要不报跨域错误,就能看到两个连线指向同一个中心节点的关系图。

从编码角度说,data里的name就是节点的主键,links通过主键引用节点,和 MySQL 表之间的外键关系是同一个思路。这也解释了为什么很多人会把数据库表关系映射成关系图来展示——从「mysql 的表导出 er 关系图」的需求到 ECharts 关系图,差的只是把表名当节点、把外键当连线。

2.3 数据从哪里来:把 MySQL 表结构转成 nodes 和 links

最常见的业务场景不是手写节点数据,而是从数据库或者后端接口拿。我一般会写一段脚本,把 MySQL 的表结构导出成关系图需要的数据格式。以 information_schema 里的外键约束为例,查询每张表的主外键关系:

SELECT rc.TABLE_NAME AS source, kcu.REFERENCED_TABLE_NAME AS target FROM information_schema.REFERENTIAL_CONSTRAINTS rc LEFT JOIN information_schema.KEY_COLUMN_USAGE kcu ON rc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME AND rc.TABLE_SCHEMA = kcu.TABLE_SCHEMA WHERE rc.CONSTRAINT_SCHEMA = 'your_database';

这条 SQL 查出来的每一行是一条外键关联,source 是子表名,target 是父表名。拿到结果后,在后端或者用 python 把行转成 ECharts 关系图的 nodes 和 links 即可。核心转换逻辑是:所有表名去重后放进data,每行外键关系放进links,顺便把表名按业务模块分组,映射成categories,这样图上就能按模块着色。

用 python 编程实现关系的管理及关系图的生成也很常见,思路是先用pymysql查数据库,再拼 ECharts 的 option JSON,最后用pyecharts直接输出 HTML。pyecharts 是对 ECharts 的 Python 封装,底层生成的就是同一份 ECharts 配置,调试时可以直接看它导出的 JSON 文件:

import pymysql from pyecharts import options as opts from pyecharts.charts import Graph # 查询外键关系 conn = pymysql.connect(host='localhost', user='root', password='****', database='your_database') cursor = conn.cursor() cursor.execute(""" SELECT rc.TABLE_NAME, kcu.REFERENCED_TABLE_NAME FROM information_schema.REFERENTIAL_CONSTRAINTS rc LEFT JOIN information_schema.KEY_COLUMN_USAGE kcu ON rc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME WHERE rc.CONSTRAINT_SCHEMA = 'your_database' """) rows = cursor.fetchall() # 去重构造节点 node_names = set() for source, target in rows: node_names.add(source) node_names.add(target) nodes = [{"name": name} for name in node_names] # 外键行直接作为连线 links = [{"source": source, "target": target} for source, target in rows] # 输出静态 HTML graph = ( Graph() .add("", nodes, links, repulsion=400, edge_length=100) .set_global_opts(title_opts=opts.TitleOpts(title="数据库表关系")) ) graph.render("db_er_graph.html")

pymysql负责连接数据库,cursor.execute执行的是和上面相同的 SQL,rows是查到的表关系元组列表。node_names是一个 set,天然去重,先把所有表名收集起来变成节点。Graph().add是 pyecharts 的链式调用,repulsion=400对应 ECharts 里的斥力大小,edge_length=100对应边的理想长度。最后render直接生成一个独立 HTML,双击就能打开看效果。这套流程跑通后,你就拥有了一条从数据库结构到关系图的自动化输出链路,RAR 里的静态示例反而成了次要的参考物。

3. 解压 RAR 并跑通示例:从压缩包到浏览器出图

拿到压缩包后的第一个动作是解压,第二个动作是把示例跑起来,第三个动作才是改造。这三个动作里藏着不少新手容易忽略的细节,尤其在 rar 格式和本地文件访问策略上。

3.1 用 7-Zip 解压 RAR:命令、目录结构与文件格式

rar 格式是专有压缩格式,Windows 下可以用 WinRAR,也可以用 7-Zip——很多新手会问「7zip 可以解压 rar 文件吗」,答案是当然可以。7-Zip 是免费软件,对 rar 的解压支持很完善,唯一做不了的是创建 rar 压缩包。命令行解压:

# 列出压缩包内容,先看里面是什么 7z l "ECharts关系图-关系图20.rar" # 完整解压到当前目录 7z x "ECharts关系图-关系图20.rar" # 解压到指定目录,-o 后面不要有空格 7z x "ECharts关系图-关系图20.rar" -o./echarts-graph-demo

参数说明:l是 list,列出压缩包内容而不解压,适合先确认里面是 HTML 文件还是整套工程;x是解压命令;-o后面紧跟输出目录,注意-o和目录名之间不能有空格,这是 7-Zip 命令行的经典坑。这类 RAR 包里最常见的文件格式是.html和.js,HTML 里通常已经写好了 ECharts 的 CDN 引用和关系图配置,JS 文件里则可能是复用的数据或封装好的函数。

解压后目录一般长这样:一个或多个 HTML 文件、可能有个js子目录放 ECharts 本地库、还可能有个data.json之类的关系数据文件。如果只有 HTML 且用的是 CDN 引入 ECharts,那么文件本身是独立的,双击就能跑;如果引用了本地echarts.js,注意相对路径别动——目录结构一变,路径失效就直接白屏。

3.2 本地起 HTTP 服务:双击打开和 localhost 的区别

很多 RAR 示例里会用fetch加载本地 JSON 数据,这时直接双击 HTML 会失败——浏览器出于安全策略禁止从file://协议下读取本地文件。现象是节点画不出来,打开开发者工具 F12 看到Access to fetch at 'file:///...' has been blocked by CORS。解决办法是起一个本地 HTTP 服务,让页面从localhost加载。最轻量的方式是用 Python:

# Python 3 自带 http.server cd ECharts关系图-关系图20 python -m http.server 8080

然后在浏览器访问http://localhost:8080/关系图.html就能正常跑。-m http.server是 Python 内置的静态文件服务器,端口默认 8000,我写 8080 是为了避免占用。

提示:8080 端口可能被其他程序占用,报错就换 8000 或者 3000。只要页面里有fetch、XMLHttpRequest或者import,一律走 HTTP 服务,别双击。

如果你电脑装了 Node.js,也可以npx serve .零配置启动——这是我很常用的方式。记住一条原则:RAR 示例如果同时带了数据文件,那 HTML 大概率不是设计成双击运行的,起 HTTP 服务是第一个要做的动作,而不是跳过它直接看代码。

3.3 替换成自己的数据:把硬编码 JSON 换成接口返回

RAR 里的示例数据在跑通之后,下一步就是把写死的节点和边替换成你自己的业务数据。常见做法是保留示例的 HTML 结构,把option里data和links赋值的地方改成fetch请求后端接口。

fetch('/api/relationships') .then(res => res.json()) .then(data => { const option = { tooltip: {}, series: [{ type: 'graph', layout: 'force', roam: true, data: data.nodes, links: data.links, categories: data.categories, label: { show: true } }] }; chart.setOption(option); });

fetch是浏览器原生 API,第一个参数是接口地址,返回的 Promise 链上先res.json()把响应转成 JSON,再拿data里的nodes、links、categories填进 option。接口返回的 JSON 结构必须和 ECharts 约定一致:nodes是数组、每项至少带name;links是数组、每项带source和target。如果后端返回的字段名不是这三个,就在.then里做一次映射,比如后端叫from和to,就写成links: data.map(d => ({ source: d.from, target: d.to }))。这一步做好后,RAR 里的示例就彻底变成了你自己的接口驱动的关系图组件,后续开发只需要维护后端数据,前端的图形配置基本不再改动。

4. 关系图的 12 个关键配置参数:布局、力引导、标签、连线

示例跑通只是开始,真正让关系图变得好用的是参数调节。ECharts 的 graph 系列配置项很多,但核心参数就围绕布局、视觉、交互三块。

4.1 layout 与 force:力导向图不是越用力越好

关系图的两个核心布局是force和circular。force是力导向,模拟物理世界中节点互相排斥、边拉住两端的力学效果;circular是环形布局,节点均匀分布在圆环上。演示数据小的时候看不出差别,一旦节点超过五十个,力导向图可能一直抖动停不下来,环形布局则稳定得多。

力导向的核心参数集中在force对象里:

series: [{ type: 'graph', layout: 'force', force: { repulsion: 300, // 节点间的斥力,越大节点越散 edgeLength: [50, 200],// 边的理想长度范围 gravity: 0.1, // 引力,把所有节点往中心拉 friction: 0.6 // 摩擦系数,越大运动衰减越快 } }]

repulsion是最需要调的参数——节点密集重叠了就调大,图形松散得不成样子了就调小。edgeLength接受一个数组,表示边的理想长度范围,ECharts 会让边尽量落在这个区间。gravity是整体向心力,值太小节点会飘到画布边缘,值太大会挤成一团。friction控制迭代收敛速度,值越大动画衰减越快,我在实际项目里一般取 0.6 到 0.8,太小的话图会一直"呼吸"不停,给人迟滞感。这些都是血泪经验:力导向图不是越用力越好,而是要让系统在 2 到 3 秒内稳定下来。

4.2 视觉通道:symbolSize、label、lineStyle、edgeSymbol

关系图的信息传递依赖几个视觉通道:节点大小、节点颜色、连线粗细、连线样式、标签位置。节点大小用symbolSize,可以直接写数值,也可以写成回调函数让数据驱动:

symbolSize: (val) => { // val 是节点的 value 字段,常用于表示节点权重 return Math.max(10, Math.min(60, Math.sqrt(val) * 3)); }

这个回调的val是节点数据里的value,通常由后端统计得出,比如每个节点关联的边数。用Math.sqrt开方是为了让面积差异更真实——节点大小和面积成比例,视觉上才不会出现小节点被大节点吞掉的情况。label控制标签,position: 'right'放在节点右侧,formatter可以回调格式化显示内容。连线样式用lineStyle和edgeSymbol配合,edgeSymbol可以在边两端画箭头或圆圈,用来表达方向性:

lineStyle: { color: 'source', // 连线颜色跟随起点节点 width: 2, curveness: 0.1, // 弯曲度,避免多条边重叠 opacity: 0.7 }, edgeSymbol: ['circle', 'arrow'], edgeSymbolSize: [4, 8]

curveness是多边关系图的关键——如果两个节点之间有多条边,直线时后画的边会盖住先画的,设 0.1 到 0.3 的弯曲度,每条边按索引递增弯曲,才能看清多条平行边。edgeSymbol的数组第一位是边起点符号,第二位是边终点符号,['circle', 'arrow']表示起点是圆、终点是箭头,适合表达有向关系。

4.3 交互与性能:roam、draggable、大数据量降级

关系图默认支持节点拖拽,但缩放和平移需要显式开启。roam: true让用户可以缩放和移动整个图,draggable: true让单个节点可以被拖动,拖动后力导向会重新分配布局。建议开启但注意:如果图是静态展示且不需要用户操作,这些配置会引入不必要的性能消耗。

大数据量下(节点几百、边上千),关系图会明显变卡。ECharts 官方建议开启animation: false关闭入场动画,能省不少渲染开销。另一个常用降级手段是控制标签显示——节点太小的就不画文本标签,只显示圆点,配合label.show的回调按节点大小动态控制。更激进的做法是在后端做一次度数过滤:只返回关联数量大于阈值的节点和它们的边,把图先瘦身再渲染。这些技巧在 echarts 社区里讨论很多,核心思路是:关系图是给人看拓扑结构的,不是让人数每个点的,该丢的细节要果断丢。

5. 踩坑记录:关系图跑不起来的 5 个典型原因

以下每条都是我在实际项目里踩过的坑,按「现象 → 原因 → 解决」的顺序写,供你对照排查。

5.1 节点只显示一个点,连线全部丢失

现象:图能渲染,但只有一个孤零零的节点,连线一条都没有。原因:links里source或target与data里的name大小写不一致,或者带隐藏空格。ECharts 对不上号不会报错,只会静默丢弃。解决:在浏览器 console 里直接打印option.series[0].links和data,逐一比对 name;写脚本生成数据时统一 trim 掉首尾空格,并确保来源表字段没有不可见字符。这个坑几乎每个做关系图的人都会踩一遍,属于典型的黑匣子问题——它不报错,所以只能靠自己核对数据。

5.2 RAR 解压后 HTML 中文乱码

现象:解压后用浏览器打开 HTML,页面上中文标签全是乱码。原因:原文件是 GBK 或 GB2312 编码,而页面里声明的是utf-8,或者根本没有声明 charset。解决:用 VS Code 或 Notepad++ 打开 HTML 文件,右下角当前编码如果是 GBK,点击后选择"通过编码重新打开",切换成 UTF-8,然后另存为 UTF-8 覆盖原文件。注意:如果 HTML 里有charset=utf-8,但文件实际是 GBK,必须重新保存编码才能生效。这个坑在从老资源站下载的 RAR 包里极常见,因为这些文件大多是早年编的,远早于 UTF-8 成为事实标准。

5.3 双击 HTML 能出来图,但加载不了数据文件

现象:双击 HTML,页面框架出来了,关系图空白;起 HTTP 服务后一切正常。原因:页面用fetch或XHR请求了同目录下的 JSON 数据文件,浏览器在file://协议下禁止这种跨文件读取。解决:别双击,用 Python 起静态服务器,命令在 3.2 节已经写过。这个不算 ECharts 的锅,是浏览器安全策略,但新手很容易被误导成"代码写错了"。

5.4 力导向图一直在晃动停不下来

现象:布局结束后图还在缓慢移动,像"活"的一样,让人看着心烦。原因:friction太小或者gravity太大,导致系统动能衰减太慢。解决:把force.friction调到 0.7 以上,同时检查repulsion是否过大——斥力越大,节点越难稳定。我自己的习惯是先调friction,再调repulsion。还有一点:roam: true开启后,用户鼠标滚动触发缩放,也会让节点看起来在动,需要确认是不是这个交互引起的。

5.5 压缩包加密导致解压失败

现象:解压时提示输入密码。原因:发布者给 RAR 设置了密码保护,可能是123456之类的简单密码,也可能根本没有。解决:先去资源站的简介页找密码提示,常见做法是把密码写在文章末尾或文件名注释里。如果实在找不到,只能联系发布者。注意:市面上声称可以破解 rar 密码的工具,大概率是流氓软件或诱导捆绑。安全起见,从正规渠道拿到密码再解压,是最稳妥的路径,别为这一点省时间而侥幸安装来路不明的软件。

6. 把关系图封装成 Vue 组件:换数据就能复用

最后给一个实用的进阶方向:把解压跑通的示例封装成 Vue 组件,以后任何业务场景只要换个数据源就能用。组件核心逻辑是mounted里初始化图表、watch选项里监听数据变化自动更新,同时记得在beforeDestroy时调用chart.dispose()销毁实例,避免内存泄漏。

<template> <div ref="graphContainer" style="width: 100%; height: 500px;"></div> </template> <script> import * as echarts from 'echarts'; export default { props: { nodes: { type: Array, required: true }, links: { type: Array, required: true }, categories: { type: Array, default: () => [] } }, mounted() { // 直接挂到 this 上,避免 Vue 对 echarts 实例做响应式劫持 this.chart = echarts.init(this.$refs.graphContainer); this.render(); window.addEventListener('resize', this.handleResize); }, watch: { nodes() { this.render(); }, links() { this.render(); } }, methods: { render() { this.chart.setOption({ tooltip: {}, series: [{ type: 'graph', layout: 'force', roam: true, data: this.nodes, links: this.links, categories: this.categories, label: { show: true, position: 'right' } }] }); }, handleResize() { this.chart && this.chart.resize(); } }, beforeDestroy() { window.removeEventListener('resize', this.handleResize); this.chart && this.chart.dispose(); } }; </script>

这个组件的使用方式:父组件从接口拉数据,组装成nodes和links数组,直接传给组件即可。我在实际项目里已经把关系图封装成类似的组件,适配过知识图谱、业务流程监控、组织架构梳理三类场景,每次只是数据源不同,配置基本没动过。验证封装是否可靠的技巧是看三个点:数据更新时组件是否自动重绘(watch 生效)、频繁切换页面路由再回来是否白屏(dispose/init 配对)、容器大小变化时图形是否被裁切(resize 监听)。这三关过了,组件就基本能上线了。

回到ECharts关系图-关系图20.rar这个包本身,我给你的建议是:把它当成一个可以修改的起点,而不是一个拿来即用的成品。先解压跑通,再按第 4 章的参数逐个调整视觉,最后用第 3 章的方法把数据源换成你自己的接口。关系图这个方向在 echarts 数据可视化里属于投入产出比很高的类型——数据模型简单、视觉冲击强、适用场景多,值得花时间把配置吃透。高效的做法是按「节点-连线-分组」三件套来组织你的数据。别像我第一次那样,拿到示例就急着改颜色,结果改了半小时发现改的是柱状图的配置,希望能帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询