echarts使用之关系图详细配置

近期使用echarts的关系图,繁多的配置项让人头疼。只能一直百度,但百度依旧让人摸不到头脑。
因此,基于网上的一篇”人民的名义关系图谱”关系图和实际项目需求,整理以下配置。
想配置什么,就查看更多,然后通过关键字 ctrl+f 查询一下吧~如果不能满足你的需求,就移步 echarts官网查看详细配置
❤️希望每个人都可以少走一些弯路❤️

echarts版本

3.8.5
注:所有配置均在option.series下,其他配置本文暂不涉及

Q & A

Q: 关系图中datalinks分别代表什么
A: data是你的节点数据列表,links是节点关系数据列表。通俗来说,data里是一个个节点,links里说明节点之间的关系,也就是links里的每一个元素都是一条边(连接两个节点),由此构成关系图。

Q: 如何全局设置节点的属性?
A: 直接设置series下:symbolSize(节点大小),itemStyle(节点样式)

Q: 如何全局设置边的属性?
A: 直接设置series下:lineStyle(边的样式)

Q: 节点上的显示文字(节点标签)如何显示?
A: 设置labelshow属性为true即可

Q: 正常和高亮状态下,标签/样式不同,如何设置?
A: 大多属性,如itemStyle/label/lineStyle/edgeLabel都有normalemphasis两个状态,分别设置就可以。

Q: 如何设置某一节点的属性?
A: data里是节点,每一个节点的基本属性大致包括

属性 含义
name 数据项名称
value 数据项的值
category 数据项所在类目的index,从0开始
symbol 该类目节点标记的图形,通过这个属性你可以设置节点显示的图标,可以是echarts提供的类型,如’circle’, ‘rect’,也可以是一个链接,或者相对地址,或者base64图片
symbolSize 节点显示图标的大小
itemStyle 节点样式
label 节点标签样式

一般来说,我们会把symbolSize的值设置成与value有关系的值,比如symbolSize = value * 2,具体还需要看实际需求

Q: 为什么我的关系图显示就像这样子,一团糟?

A: 尝试一下设置series下的force属性

1
2
3
force: {
repusion: 1000 //节点间的斥力因子,默认是50
}

设置后效果图

1
2
3
4
force: {
repusion: 1000, // 节点间的斥力因子,默认是50
edgeLength: [100,500] // 边的两个节点之间的距离,默认是[10,50]
}

设置后效果图如下,具体还需要根据实际需求修改值的配置

Q: 为什么我的关系图是直线型的?像这样

A: 通过设置边的线条样式lineStyle下的curveness (边的曲度)实现曲边

结合以上图片,说明一下两个官方术语
label图形上的文本标签,就是关系图上人物的名字
edgeLabel关系标签(边标签),就是两个人物之间的关系,如母女,姐妹,下属

Q: 我有一个需求,点击某个按钮,要高亮某几条指定的关系线怎么办?
A: 官网上有一个方法将指定的节点以及其所有邻接节点高亮

1
2
3
4
5
6
7
8
9
10
11
myChart.dispatchAction({
type: 'focusNodeAdjacency',

// 使用 seriesId 或 seriesIndex 或 seriesName 来定位 series.
seriesId: 'xxx',
seriesIndex: 0,
seriesName: 'nnn',

// 使用 dataIndex 来定位节点。
dataIndex: 12
})

根据这个方法,在源码中新增一个方法,高亮指定的边(通过边在links数组所属的下标值)

1
2
3
4
5
6
7
8
9
10
11
12
myFocusEdge: function (seriesModel, ecModel, api, payload) {
var data = this._model.getData();
var graph = data.graph;
var my_edge = payload.edgeIndexs; // 数组
my_edge.forEach(function(edge_item){
var edgeDataIndex = edge_item;
var edge = graph.getEdgeByIndex(edgeDataIndex);
if (edge) {
fadeInItem(edge, lineOpacityPath);
}
})
}

注册:

1
2
3
4
5
registerAction({
type: 'myFocusEdge',
event: 'myFocusEdge',
update: 'series.graph:myFocusEdge'
}, function () {});

如何调用?

1
2
3
4
5
6
7
8
9
myChart.dispatchAction({
type: 'myFocusEdge',
// 使用 seriesId 或 seriesIndex 或 seriesName 来定位 series.
seriesId: 'xxx',
seriesIndex: 0,
seriesName: 'nnn',
// 使用 edgeIndexs 来定位节点。
edgeIndexs: [3,4,5]
})

相应的,增加一个方法,取消高亮指定的边,调用方法基本同上(需要改一下方法名哦)

1
2
3
4
5
6
7
8
9
10
11
myUnFocusEdge: function (seriesModel, ecModel, api, payload) {
var graph = this._model.getData().graph;
var my_edge = payload.edgeIndexs;// 数组
my_edge.forEach(function(edge_item){
var edgeDataIndex = edge_item;
var edge = graph.getEdgeByIndex(edgeDataIndex);
if (edge) {
fadeOutItem(edge, lineOpacityPath);
}
})
}

DEMO

html

提供一个容器

1
<div id="chart" style="width:800px;height:800px"></div>

js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
let myChart = echarts.init(document.getElementById('chart'))
const option = {
title: { text: '人民的名义关系图谱' },
tooltip: {
formatter: function (x) {
return x.data.des;
}
},
series: [
{
type: 'graph',
// 图的布局:可选: none circular(环形布局) force(力引导布局)
layout: 'force',
// 关系图节点标记的大小
symbolSize: 40,
// 是否开启鼠标缩放和平移漫游
roam: true,
// 边两端的标记类型
edgeSymbol: ['circle', 'arrow'],
// 边两端的标记大小
edgeSymbolSize: [4, 10],
// 力引导布局相关的配置项
force: {
// 节点之间的斥力因子,值越大,斥力越大。通俗来说,值越大,两个节点之间的距离越大,即关系边的长度越长
repulsion: 1000,
// 边的两个节点之间的距离,以下设置:值最大的边长度会趋向于10,值最小的边长度会趋向于50
// edgeLength: [10, 50]
},
// 节点是否可拖拽
draggable: true,
// 节点样式
itemStyle: {
normal: {
color: '#2f4554'
},
emphasis: {
borderColor: '#fff',
borderWidth: 1,
shadowBlur: 10,
shadowColor: 'rgba(0, 0, 0, 0.8)'
}
},
// 关系边的公用线条样式
lineStyle: {
normal: {
textStyle: {
fontSize: 20
},
width: 2,
color: '#4b565b',
// 边的曲度
curveness: 0.1
}
},
// 边的标签样式
edgeLabel: {
normal: {
show: true,
formatter: function (x) {
return x.data.name;
}
}
},
// 节点标签的样式
label: {
normal: {
show: true,
textStyle: {
}
}
},
data: [
{
name: '侯亮平',
des: '最高检反贪局侦查处处长,汉东省人民检察院副检察长兼反贪局局长。<br/>经过与腐败违法分子的斗争,最终将一批腐败分子送上了审判台,<br/>正义战胜邪恶,自己也迎来了成长。',
symbolSize: 80,
itemStyle: {
normal: {
color: '#c23531'
}
}
},
{
name: '李达康',
des: '汉东省省委常委,京州市市委书记。是一个正义无私的好官。<br/>但为人过于爱惜自己的羽毛,对待身边的亲人和朋友显得有些无情。',
itemStyle: {
normal: {
color: '#c23531'
}
}
},
{
name: '祁同伟',
des: '汉东省公安厅厅长',
symbolSize: 80
},
name: '陈岩石',
des: '离休干部、汉东省检察院前常务副检察长。充满正义,平凡而普通的共 产 党人。<br/>对大老虎赵立春,以各种形式执着举报了十二年。<br/>在这场关系党和国家生死存亡的斗争中,老人家以耄耋高龄,<br/>义无反顾地背起了炸 药包,在反腐胜利前夕因病去世。',
itemStyle: {
normal: {
color: '#c23531'
}
}
},
{
name: '陆亦可',
des: '汉东省检察院反贪局一处处长',
itemStyle: {
normal: {
color: '#c23531'
}
}
},
{
name: '高育良',
des: '汉东省省委副书记兼政法委书记。年近六十,是一个擅长太极功夫的官场老手。侯亮平、陈海和祁同伟是其学生。',
symbolSize: 80
},
{
name: '沙瑞金',
des: '汉东省省委书记',
itemStyle: {
normal: {
color: '#c23531'
}
}
},
{
name: '高小琴',
des: '山水集团董事长,是一位叱咤于政界和商界的风云人物,处事圆滑、精明干练。'
},
{
name: '高小凤'
},
{
name: '赵东来',
des: '汉东省京州市公安局局长,充满正义,整治恶势力,<br/>在与检察部门的合作中从最初的质疑到之后的通力配合。',
itemStyle: {
normal: {
color: '#c23531'
}
}
},
{
name: '程度',
des: '汉东省京州市公安局光明区分局局长,因犯错误,被李达康书记和赵东来局长点名要清除公安队伍。<br/>但在高小琴的帮助下,祁同伟调他当上了省公安厅办公室副主任。<br/>尽管程度逃避了所有罪责,上面也有人保他,<br/>但最终还是在反贪局局长侯亮平的缜密侦查下被绳之于法。',
},
{
name: '吴惠芬',
des: '汉东省省委副书记高育良的妻子,汉东大学明史教授。',
itemStyle: {
normal: {
color: '#c23531'
}
}
},
{
name: '赵瑞龙',
des: '副国级人物赵立春的公子哥,官二代,打着老子的旗子,<br/>黑白两道通吃,可谓呼风唤雨,权倾一时。',
},
{
name: '赵立春',
des: '副国级领导人,曾经的改革闯将,在权利面前,显得极其渺小。',
},
{
name: '陈海',
itemStyle: {
normal: {
color: '#c23531'
}
}
},
{
name: '梁璐',
itemStyle: {
normal: {
color: '#c23531'
}
}
},
{
name: '刘新建'
},
{
name: '欧阳菁'
},
{
name: '吴心怡',
itemStyle: {
normal: {
color: '#c23531'
}
}
},
{
name: '蔡成功'
},
{
name: '丁义珍'
}
],
links: [
{
source: '高育良',
target: '侯亮平',
name: '师生',
des: '侯亮平是高育良的得意门生'
},
{
source: '高育良',
target: '祁同伟',
name: '师生'
},
{
source: '赵立春',
target: '高育良',
name: "前领导"
},
{
source: '赵立春',
target: '赵瑞龙',
name: "父子"
},
{
source: '赵立春',
target: '刘新建',
name: "前部队下属"
},
{
source: '李达康',
target: '赵立春',
name: "前任秘书"
},
{
source: '祁同伟',
target: '高小琴',
name: "情人"
},
{
source: '陈岩石',
target: '陈海',
name: "父子"
},
{
source: '陆亦可',
target: '陈海',
name: "属下"
},
{
source: '沙瑞金',
target: '陈岩石',
name: "故人"
},
{
source: '祁同伟',
target: '陈海',
name: "师哥"
},
{
source: '祁同伟',
target: '侯亮平',
name: "师哥"
},
{
source: '侯亮平',
target: '陈海',
name: "同学,生死朋友"
},
{
source: '高育良',
target: '吴惠芬',
name: "夫妻"
},
{
source: '陈海',
target: '赵东来',
name: "朋友"
},
{
source: '高小琴',
target: '高小凤',
name: "双胞胎",
symbolSize: '1'
},
{
source: '赵东来',
target: '陆亦可',
name: "爱慕"
},
{
source: '祁同伟',
target: '程度',
name: "领导"
},
{
source: '高育良',
target: '高小凤',
name: "情人"
},
{
source: '赵瑞龙',
target: '祁同伟',
name: "勾结",
symbolSize: '1',
},
{
source: '李达康',
target: '赵东来',
name: "领导"
},
{
source: '赵瑞龙',
target: '程度',
name: "领导"
},
{
source: '沙瑞金',
target: '李达康',
name: "领导"
},
{
source: '沙瑞金',
target: '高育良',
name: "领导"
},
{
source: '祁同伟',
target: '梁璐',
name: "夫妻"
},
{
source: '吴惠芬',
target: '梁璐',
name: "朋友"
},
{
source: '李达康',
target: '欧阳菁',
name: "夫妻"
},
{
source: '赵瑞龙',
target: '刘新建',
name: "洗钱工具"
},
{
source: '赵瑞龙',
target: '高小琴',
name: "勾结,腐化",
symbolSize: '1'
},
{
source: '赵瑞龙',
target: '高小凤',
name: "腐化"
},
{
source: '吴心怡',
target: '陆亦可',
name: "母女"
},
{
source: '吴心怡',
target: '吴惠芬',
name: "姐妹"
},
{
source: '蔡成功',
target: '侯亮平',
name: "发小"
},
{
source: '蔡成功',
target: '欧阳菁',
name: "举报",
lineStyle: {
normal: {
type: 'dotted',
color: '#000'
}
}
},
{
source: '欧阳菁',
target: '刘新建',
name: "举报",
lineStyle: {
normal: {
type: 'dotted',
color: '#000'
}
}
},
{
source: '刘新建',
target: '赵瑞龙',
name: "举报",
lineStyle: {
normal: {
type: 'dotted',
color: '#000'
}
}
},
{
source: '李达康',
target: '丁义珍',
name: "领导"
},
{
source: '高小琴',
target: '丁义珍',
name: "策划出逃"
},
{
source: '祁同伟',
target: '丁义珍',
name: "勾结"
},
{
source: '赵瑞龙',
target: '丁义珍',
name: "勾结"
}]
}
]
}
myChart.setOption(option)
-------------本文结束 感谢您的阅读-------------