echarts 關係圖節點重名問題解決方案!
阿新 • • 發佈:2018-12-28
- 專案中用到echarts現在不足為奇,但是關係圖(graph)這個東西比常規的餅圖,條形圖,折線圖等等這些都要難搞一些,專案中會有很多需求,
- 比如,A和B之間有多重關係能不能畫兩條以上的線? 這個問題我遇到過,echarts本身就沒有實現兩條線以上這個功能,在官網只能找到最多兩條線的demo,最後只有想其他辦法解決專案需求。
再比如,關係圖節點名稱的問題,我們一般都是把人員姓名來做顯示,那麼問題來了,當遇到重名的時候咋辦呢?如果按照常規demo上的配置項來做肯定會報錯,這也是本篇文章主要要講的東西,我這裡有兩種方式來解決這個。
第一種:先貼上程式碼
- <!DOCTYPE html>
- <html>
- <head>
- <title>graph</title>
- <meta charset="utf-8">
- </head>
- <body>
- <script type="text/javascript" src="echarts.js"></script>
- <div id="main" style="width: 700px;height: 700px"></div>
- <script type="text/javascript">
- var dom = document.getElementById('main');
- var myChart = echarts.init(dom);
- var datas = [{
- name: '節點1',
- itemStyle: {
- normal: {
- color: '#f90', //圓點的顏色
- label: {
- position: 'bottom',
- textStyle: {
- color: '#f90'
- }
- }
- }
- },
- }, {
- name: '節點2',
- category: 1,
- itemStyle: {
- normal: {
- color: '#090',
- },
- emphasis: {
- color: "#000"
- }
- }
- }, {
- name: '節點2',
- category: 1,
- draggable: true,
- }, {
- name: '節點3',
- category: 0,
- draggable: true,
- }, {
- name: '節點5',
- category: 0,
- draggable: true,
- }, {
- name: '節點6',
- category: 0,
- draggable: true,
- }]
- var obj = {};
- for(var i=0;i<datas.length;i++){
- obj[i] = datas[i].name;
- }
- console.log(obj);
- var data = [];
- for(var p in obj){
- data.push({
- name: p,
- showName: obj[p],
- tooltip: {
- show: true,
- formatter: function(params){
- return params.data.showName
- }
- }
- })
- }
- var option = {
- tooltip: {
- show: false
- },
- legend: {
- x: "center",
- data: ["家人", "朋友"]
- },
- animation: false,
- series: [{
- categories: [{
- name: '家人',
- itemStyle: {
- normal: {
- color: "#009800",
- }
- }
- }, {
- name: '朋友',
- itemStyle: {
- normal: {
- color: "#4592FF",
- }
- }
- }],
- type: 'graph',
- layout: 'force',
- symbol: "circle",
- symbolSize: 50,
- roam: true, //禁止用滑鼠滾輪縮小放大效果
- edgeSymbol: ['circle', 'arrow'],
- edgeSymbolSize: [0, 10],
- // 連線線上的文字
- focusNodeAdjacency: true, //劃過只顯示對應關係
- edgeLabel: {
- normal: {
- show: true,
- textStyle: {
- fontSize: 20
- },
- formatter: "{c}"
- }
- },
- lineStyle: {
- normal: {
- opacity: 1,
- width: 2,
- curveness: 0
- }
- },
- // 圓圈內的文字
- label: {
- normal: {
- show: true,
- formatter: function(params){
- return params.data.showName
- }
- }
- },
- force: {
- repulsion: 5000
- },
- data: data,
- links: [{
- source: 0,
- target: 1,
- value: "朋友",
- lineStyle: {
- normal: {
- color: '#38f',
- curveness: 0 // 線的彎曲度 0-1之間 越大則歪曲度更大
- }
- },
- label: {
- normal: {
- textStyle: {
- color: '#07ac72'
- }
- }
- }
- }, {
- source: 0,
- target: 2,
- value: "朋友"
- }, {
- source: 0,
- target: 3,
- value: "家人"
- }, {
- source: 0,
- target: 4,
- value: "家人"
- }, {
- source: 0,
- target: 5,
- value: "家人"
- }, ]
- }]
- };
- myChart.setOption(option);
- </script>
- </body>
- </html>
以上程式碼執行結果如下圖:
都有程式碼了,自己花點時間去研究下吧,我就不贅述了。
第二種方式:這種方式很簡單,就是給datas裡面加上一個唯一標識的,而這個欄位名必須是''id'',下面也提供一個簡單的例子吧。
- option = {
- title: {
- text: 'Graph 簡單示例'
- },
- tooltip: {},
- animationDurationUpdate: 1500,
- animationEasingUpdate: 'quinticInOut',
- series : [
- {
- type: 'graph',
- layout: 'none',
- symbolSize: 50,
- roam: true,
- label: {
- normal: {
- show: true
- }
- },
- edgeSymbol: ['circle', 'arrow'],
- edgeSymbolSize: [4, 10],
- edgeLabel: {
- normal: {
- textStyle: {
- fontSize: 20
- }
- }
- },
- data: [{
- name: '節點1',
- id: '120',
- x: 300,
- y: 300
- }, {
- name: '節點2',
- id: '121',
- x: 800,
- y: 300
- }, {
- name: '節點2',
- id: '123',
- x: 550,
- y: 100
- }, {
- name: '節點4',
- id: '124',
- x: 550,
- y: 500
- }],
- // links: [],
- links: [{
- source: '120',
- target: '121',
- symbolSize: [5, 20],
- label: {
- normal: {
- show: true
- }
- },
- lineStyle: {
- normal: {
- width: 5,
- curveness: 0.2
- }
- }
- }, {
- source: '120',
- target: '122',
- label: {
- normal: {
- show: true
- }
- },
- lineStyle: {
- normal: { curveness: 0.2 }
- }
- }, {
- source: '120',
- target: '123'
- }, {
- source: '120',
- target: '124'
- }],
- lineStyle: {
- normal: {
- opacity: 0.9,
- width: 2,
- curveness: 0
- }
- }
- }
- ]
- };
最後效果圖如下:
謝謝大家!