1. 程式人生 > >echarts 關係圖節點重名問題解決方案!

echarts 關係圖節點重名問題解決方案!

  1. 專案中用到echarts現在不足為奇,但是關係圖(graph)這個東西比常規的餅圖,條形圖,折線圖等等這些都要難搞一些,專案中會有很多需求,
  2.   比如,A和B之間有多重關係能不能畫兩條以上的線? 這個問題我遇到過,echarts本身就沒有實現兩條線以上這個功能,在官網只能找到最多兩條線的demo,最後只有想其他辦法解決專案需求。
  3. 再比如,關係圖節點名稱的問題,我們一般都是把人員姓名來做顯示,那麼問題來了,當遇到重名的時候咋辦呢?如果按照常規demo上的配置項來做肯定會報錯,這也是本篇文章主要要講的東西,我這裡有兩種方式來解決這個。


    第一種:先貼上程式碼

  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7.     <title>graph</title>
  8.     <meta charset="utf-8">
  9. </head>
  10. <body>
  11. <script type="text/javascript" src="echarts.js"></script>
  12. <div id="main" style="width: 700px;height: 700px"></div>
  13. <script type="text/javascript">
  14.     var dom = document.getElementById('main');
  15.     var myChart = echarts.init(dom);
  16.     var datas = [{
  17.             name: '節點1',
  18.             itemStyle: {
  19.                 normal: {
  20.                     color: '#f90', //圓點的顏色
  21.                     label: {
  22.                         position: 'bottom',
  23.                         textStyle: {
  24.                             color: '#f90'
  25.                         }
  26.                     }
  27.                 }
  28.             },
  29.         }, {
  30.             name: '節點2',
  31.             category: 1,
  32.             itemStyle: {
  33.                 normal: {
  34.                     color: '#090',
  35.                 },
  36.                 emphasis: {
  37.                     color: "#000"
  38.                 }
  39.             }
  40.         }, {
  41.             name: '節點2',
  42.             category: 1,
  43.             draggable: true,
  44.         }, {
  45.             name: '節點3',
  46.             category: 0,
  47.             draggable: true,
  48.         }, {
  49.             name: '節點5',
  50.             category: 0,
  51.             draggable: true,
  52.         }, {
  53.             name: '節點6',
  54.             category: 0,
  55.             draggable: true,
  56.         }]
  57.         var obj = {};
  58.         for(var i=0;i<datas.length;i++){
  59.             obj[i] = datas[i].name;
  60.         }
  61.         console.log(obj);
  62.         var data = [];
  63.         for(var p in obj){
  64.             data.push({
  65.                 name: p,
  66.                 showName: obj[p],
  67.                 tooltip: {
  68.                     show: true,
  69.                     formatter: function(params){
  70.                         return params.data.showName
  71.                     }
  72.                 }
  73.             })
  74.         }
  75.     var option = {
  76.     tooltip: {
  77.         show: false
  78.     },
  79.     legend: {
  80.         x: "center",
  81.         data: ["家人", "朋友"]
  82.     },
  83.     animation: false,
  84.     series: [{
  85.         categories: [{
  86.             name: '家人',
  87.             itemStyle: {
  88.                 normal: {
  89.                     color: "#009800",
  90.                 }
  91.             }
  92.         }, {
  93.             name: '朋友',
  94.             itemStyle: {
  95.                 normal: {
  96.                     color: "#4592FF",
  97.                 }
  98.             }
  99.         }],
  100.         type: 'graph',
  101.         layout: 'force',
  102.         symbol: "circle",
  103.         symbolSize: 50,
  104.         roam: true, //禁止用滑鼠滾輪縮小放大效果
  105.         edgeSymbol: ['circle', 'arrow'],
  106.         edgeSymbolSize: [0, 10],
  107.         // 連線線上的文字
  108.         focusNodeAdjacency: true, //劃過只顯示對應關係
  109.         edgeLabel: {
  110.             normal: {
  111.                 show: true,
  112.                 textStyle: {
  113.                     fontSize: 20
  114.                 },
  115.                 formatter: "{c}"
  116.             }
  117.         },
  118.         lineStyle: {
  119.             normal: {
  120.                 opacity: 1,
  121.                 width: 2,
  122.                 curveness: 0
  123.             }
  124.         },
  125.         // 圓圈內的文字
  126.         label: {
  127.             normal: {
  128.                 show: true,
  129.                 formatter: function(params){
  130.                     return params.data.showName
  131.                 }
  132.             }
  133.         },
  134.         force: {
  135.             repulsion: 5000
  136.         },
  137.         data: data,
  138.         links: [{
  139.             source: 0,
  140.             target: 1,
  141.             value: "朋友",
  142.             lineStyle: {
  143.                 normal: {
  144.                     color: '#38f',
  145.                     curveness: 0 // 線的彎曲度 0-1之間 越大則歪曲度更大
  146.                 }
  147.             },
  148.             label: {
  149.                 normal: {
  150.                     textStyle: {
  151.                         color: '#07ac72'
  152.                     }
  153.                 }
  154.             }
  155.         }, {
  156.             source: 0,
  157.             target: 2,
  158.             value: "朋友"
  159.         }, {
  160.             source: 0,
  161.             target: 3,
  162.             value: "家人"
  163.         }, {
  164.             source: 0,
  165.             target: 4,
  166.             value: "家人"
  167.         }, {
  168.             source: 0,
  169.             target: 5,
  170.             value: "家人"
  171.         }, ]
  172.     }]
  173. };
  174. myChart.setOption(option);
  175. </script>
  176. </body>
  177. </html>

以上程式碼執行結果如下圖:

 

 都有程式碼了,自己花點時間去研究下吧,我就不贅述了。

 

第二種方式:這種方式很簡單,就是給datas裡面加上一個唯一標識的,而這個欄位名必須是''id'',下面也提供一個簡單的例子吧。

  1. option = {
  2.     title: {
  3.         text: 'Graph 簡單示例'
  4.     },
  5.     tooltip: {},
  6.     animationDurationUpdate: 1500,
  7.     animationEasingUpdate: 'quinticInOut',
  8.     series : [
  9.         {
  10.             type: 'graph',
  11.             layout: 'none',
  12.             symbolSize: 50,
  13.             roam: true,
  14.             label: {
  15.                 normal: {
  16.                     show: true
  17.                 }
  18.             },
  19.             edgeSymbol: ['circle', 'arrow'],
  20.             edgeSymbolSize: [4, 10],
  21.             edgeLabel: {
  22.                 normal: {
  23.                     textStyle: {
  24.                         fontSize: 20
  25.                     }
  26.                 }
  27.             },
  28.             data: [{
  29.                 name: '節點1',
  30.                 id: '120',
  31.                 x: 300,
  32.                 y: 300
  33.             }, {
  34.                 name: '節點2',
  35.                 id: '121',
  36.                 x: 800,
  37.                 y: 300
  38.             }, {
  39.                 name: '節點2',
  40.                 id: '123',
  41.                 x: 550,
  42.                 y: 100
  43.             }, {
  44.                 name: '節點4',
  45.                 id: '124',
  46.                 x: 550,
  47.                 y: 500
  48.             }],
  49.             // links: [],
  50.             links: [{
  51.                 source: '120',
  52.                 target: '121',
  53.                 symbolSize: [5, 20],
  54.                 label: {
  55.                     normal: {
  56.                         show: true
  57.                     }
  58.                 },
  59.                 lineStyle: {
  60.                     normal: {
  61.                         width: 5,
  62.                         curveness: 0.2
  63.                     }
  64.                 }
  65.             }, {
  66.                 source: '120',
  67.                 target: '122',
  68.                 label: {
  69.                     normal: {
  70.                         show: true
  71.                     }
  72.                 },
  73.                 lineStyle: {
  74.                     normal: { curveness: 0.2 }
  75.                 }
  76.             }, {
  77.                 source: '120',
  78.                 target: '123'
  79.             }, {
  80.                 source: '120',
  81.                 target: '124'
  82.             }],
  83.             lineStyle: {
  84.                 normal: {
  85.                     opacity: 0.9,
  86.                     width: 2,
  87.                     curveness: 0
  88.                 }
  89.             }
  90.         }
  91.     ]
  92. };

最後效果圖如下:

 

謝謝大家!