下面我将为你提供一个全面的指南,从最简单的方法到更高级的定制,并附上完整的代码示例。

(图片来源网络,侵删)
核心概念
一个关系图(或称网络图、图论图)由两部分组成:
- 节点:代表图中的实体,比如人、公司、文件等。
- 边:代表节点之间的关系,朋友”、“属于”、“依赖”等。
我们的目标就是用 JavaScript 在网页上绘制这些节点和边,并让它们能够以某种有意义的布局展示出来。
使用成熟的可视化库(推荐)
对于绝大多数应用,直接使用现成的库是最高效、最稳定的方法,这些库已经解决了布局算法、渲染、交互等所有复杂问题。
主流库推荐
| 库名 | 特点 | 适用场景 | 学习曲线 |
|---|---|---|---|
| D3.js | 功能最强大、最灵活,底层基于 SVG 和 Canvas。 | 需要高度定制化、复杂的动态数据可视化。 | 较陡 |
| ECharts | 百度出品,配置简单,内置多种图表类型和布局。 | 快速开发,对性能要求高,需要多种图表类型。 | 平缓 |
| G6 | 蚂蚁集团出品,专注于图可视化,内置多种智能布局。 | 复杂关系网络分析,大规模图数据,强调交互体验。 | 平缓 |
| Vis.js | 轻量级,易于使用,节点和边可以自定义为 HTML 元素。 | 中小型图,需要将复杂 DOM 元素作为节点。 | 平缓 |
如果你是初学者或想快速实现,ECharts 或 G6 是绝佳选择,如果你需要完全的控制力,并且不畏惧学习曲线,D3.js 是你的终极武器。

(图片来源网络,侵删)
使用 Canvas 手动实现(原理讲解)
如果你想深入理解关系图的底层原理,或者有非常特殊的渲染需求,可以尝试自己用 Canvas 实现,这会让你明白布局算法和渲染循环的重要性。
我们将手动实现一个简单的力导向布局图。
核心步骤
- HTML 结构: 创建一个
<canvas>元素。 - 数据准备: 定义节点和边的数组。
- 物理模拟 (力导向布局):
- 斥力: 所有节点之间互相排斥,避免重叠。
- 引力: 连接的节点之间互相吸引,保持距离。
- 通过不断计算和更新这些力,节点会逐渐移动到能量最低的稳定状态,形成自然的布局。
- 渲染循环: 在每一帧中,清空画布,根据节点的当前位置重新绘制所有节点和边。
- 交互: 监听鼠标事件,实现拖拽、高亮等交互。
完整代码示例(使用 ECharts - 最简单)
这里我们使用 ECharts 来快速创建一个交互式关系图。
HTML 文件 (index.html)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">JavaScript 关系图示例</title>
<!-- 引入 ECharts 文件 -->
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.3/dist/echarts.min.js"></script>
<style>
body {
margin: 0;
padding: 20px;
font-family: Arial, sans-serif;
display: flex;
flex-direction: column;
align-items: center;
}
#main {
width: 100%;
max-width: 1000px;
height: 600px;
border: 1px solid #ccc;
border-radius: 8px;
}
</style>
</head>
<body>
<h1>我的关系图</h1>
<div id="main"></div>
<script src="graph.js"></script>
</body>
</html>
JavaScript 文件 (graph.js)
// 1. 初始化 ECharts 实例
const chartDom = document.getElementById('main');
const myChart = echarts.init(chartDom);
// 2. 准备数据
// 节点数据
const nodes = [
{ id: 'A', name: '节点 A', symbolSize: 60, itemStyle: { color: '#5470c6' } },
{ id: 'B', name: '节点 B', symbolSize: 50, itemStyle: { color: '#91cc75' } },
{ id: 'C', name: '节点 C', symbolSize: 55, itemStyle: { color: '#fac858' } },
{ id: 'D', name: '节点 D', symbolSize: 45, itemStyle: { color: '#ee6666' } },
{ id: 'E', name: '节点 E', symbolSize: 50, itemStyle: { color: '#73c0de' } },
{ id: 'F', name: '节点 F', symbolSize: 40, itemStyle: { color: '#3ba272' } },
{ id: 'G', name: '节点 G', symbolSize: 50, itemStyle: { color: '#fc8452' } },
{ id: 'H', name: '节点 H', symbolSize: 45, itemStyle: { color: '#9a60b4' } }
];
// 边数据,表示节点之间的关系
const links = [
{ source: 'A', target: 'B' },
{ source: 'A', target: 'C' },
{ source: 'B', target: 'D' },
{ source: 'C', target: 'E' },
{ source: 'D', target: 'F' },
{ source: 'E', target: 'F' },
{ source: 'F', target: 'G' },
{ source: 'G', target: 'H' }
];
// 3. 配置项
const option = {
// 标题 {
text: '关系网络图',
left: 'center'
},
// 工具箱
toolbox: {
feature: {
restore: {},
saveAsImage: {}
}
},
// 提示框
tooltip: {},
// 力导向布局相关的配置
series: [
{
name: '关系图',
type: 'graph', // 图表类型为 'graph'
layout: 'force', // 使用力导向布局
data: nodes, // 数据
links: links, // 关系数据
// 力导向布局的详细配置
force: {
repulsion: 500, // 节点间的斥力因子,值越大,斥力越大
edgeLength: 100, // 边的长度,值越大,节点间距离越远
gravity: 0.1 // 节点向中心的引力因子
},
// 自定义标签样式
label: {
show: true,
position: 'inside',
fontSize: 12
},
// 鼠标悬停时的高亮样式
emphasis: {
focus: 'adjacency', // 高亮与当前节点相邻的节点和边
lineStyle: {
width: 10
}
},
// 缩放和平移
roam: true,
// 自定义边的样式
lineStyle: {
color: 'source',
curveness: 0.3
}
}
]
};
// 4. 使用配置项显示图表
myChart.setOption(option);
// 5. 窗口大小改变时,重置图表大小
window.addEventListener('resize', function() {
myChart.resize();
});
如何运行
- 将上面的 HTML 代码保存为
index.html。 - 将 JavaScript 代码保存为
graph.js,并与index.html放在同一个文件夹下。 - 用浏览器打开
index.html文件。
你将看到一个交互式的力导向关系图,你可以:

(图片来源网络,侵删)
- 拖动节点。
- 缩放和平移整个画布。
- 将鼠标悬停在节点上,查看其相邻关系。
- 点击右上角的“下载”按钮保存图片。
进阶功能
一旦你掌握了基本用法,可以尝试以下进阶功能:
- 动态数据: 使用
echartsInstance.setOption(newOption)方法来动态更新或添加节点和边。 - 更复杂的布局: ECharts 和 G6 提供了多种布局算法,如圆形布局、树状布局、dagre布局(用于流程图)等。
- 自定义节点和边: 节点可以是图片、HTML 片段,边也可以是曲线、虚线等。
- 丰富的交互: 实现点击节点弹出详情、拖拽节点后更新布局、搜索并高亮特定节点等。
- 数据绑定: 将你的关系图与后端 API 结合,实现数据的动态加载。
希望这个详细的指南能帮助你开始你的 JavaScript 关系图项目!
