echarts关系图graph绘制拓扑图, 使用过程中遇到的坑...

用echarts绘制topo图,研究了下最终决定使用其中的graph关系图,由于项目中数据比较复杂,在数据处理和使用echarts绘制时,遇到了几个坑, 因此决定在此记录一下下...

一、项目情况

1.框架angular8
2.ng-zorro7.5x
3.echarts4.2.1~

二、需求

1.需求:使用echarts绘制设备间的拓扑图
选择示例:echarts 关系图graph悲惨世界人物关系图/力引导布局

三、基础代码片段

var chartDom = document.getElementById('main');
var myChart = echarts.init(chartDom, 'dark');
var option;
option = {
    title: {
      text: 'Les Miserables',
      subtext: 'Default layout',
      top: 'bottom',
      left: 'right'
    },
    tooltip: {},
    series: [
          {
            name: 'Les Miserables',
            type: 'graph',
            layout: 'force',
            data: graph.nodes,
            links: graph.links,
            categories: graph.categories,
          }
    ]
  };
  
   myChart.setOption(option);

四、数据构造

var graph = {
    "nodes": [
      {
        "id": "0",
        "name": "Myriel",
        "draggable": true
      },
      {
        "id": "1",
        "name": "Napoleon",
        "draggable": true
      },
      {
        "id": "2",
        "name": "MlleBaptistine",
        "draggable": true
      },
      {
        "id": "3",
        "name": "MmeMagloire",
        "draggable": true
      },
      {
        "id": "4",
        "name": "CountessDeLo",
        "draggable": true
      },
    ],
   "links": [
      {
        "source": "1",
        "target": "0",
        "relation": {name: 'http'},
      },
      {
        "source": "2",
        "target": "3",
        "relation": {name: 'modbus'}
      },
      {
        "source": "3",
        "target": "0",
        "relation": {name: 'mqtt'}
      },
      {
        "source": "3",
        "target": "2",
         "relation": {name: 'snmp'}
      }
    ],
    "categories": [
      {
        "name": "http",
         "itemStyle":{color:'#91e8e1'},
      },
      {
        "name": "modbus",
         "itemStyle":{color:'#2b908f'},
        
      },
      {
        "name": "mqtt",
         "itemStyle":{color:'#e4d354'},
      },
      {
        "name": "snmp",
         "itemStyle":{color:'#f15c80'},
      }
    ]
  };

五、结果如图所示

image.png

此时展示的图形们有几个问题,第一节点过小,第二不知道这些节点分别是谁,因此首先要增加节点样式

5.1 设置节点样式

节点样式可以在nodes数据中分别设置,也可以在series中直接设置,本文采用在series中统一设置的形式:

series: [
          {
            name: 'Les Miserables',
            type: 'graph',
            layout: 'force',
            data: graph.nodes,
            links: graph.links,
            categories: graph.categories,
            label: { //节点显示名称
              show: true,
              position: "bottom",
              distance: 5,
              fontSize: 18,
              align: "center",
              
            },
            // symbol: 'image:///assets/images/devices/device.png', // 设置节点图片或形状,
//circle,'rect'等,具体见官网api示例

            symbolSize: 30, // 节点大小
          }
    ]

image.png
5.2 配置series

此时我们看图可以看到,所有的节点都挨着,所以说明节点间没有排斥力,同时关系间的线的长度都没有设置,节点之间的关系也没有显示,因此直接在series增加相应的设置即可,最终的series如下:

 series: [
      {
        name: 'Les Miserables',
        type: 'graph',
        layout: 'force',
        data: graph.nodes,
        links: graph.links,
        categories: graph.categories,
        label: {
              show: true,
              position: "bottom",
              distance: 5,
              fontSize: 18,
              align: "center",
              
            },
        symbolSize: 30,
        roam: true,
        edgeSymbol: ["circle", "arrow"],
        force: { // 节点排斥力设置
            repulsion: 200,
            gravity: 0.01,
            edgeLength: 200
        },
        lineStyle: { 
          color: 'source',
          curveness: 0.3 // 线的曲率
        },
        emphasis: { //高亮状态的图形样式,v5.0版本及以上
          focus: 'adjacency',
          lineStyle: {
            width: 10
          }
        },
        edgeLabel: {//边的设置(节点之间的关系)
              show: true,
              position: "middle",
              fontSize: 12,
              formatter: (params) => {
                return params.data.relation.name;
          },
        },
      }
    ]

image.png
5.3 配置legend

此时我们可以看到图形中是没有小标题legend的,需在option中设置,最终的option如下:

option = {
    title: {
      text: 'Les Miserables',
      subtext: 'Default layout',
      top: 'bottom',
      left: 'right'
    },
    tooltip: {},
    legend: [
      {
        // selectedMode: 'single',
        data: graph.categories.map(function (a) {
          return a.name;
        })
      }
    ],
    animationDuration: 1500,
    animationEasingUpdate: 'quinticInOut',
    series:[...] // 如上已展示,在此不再具体写出
  };
image.png
5.4 legend默认点击事件不生效问题

此时可以看出legend与图形节点之间并没有一一对应,legend的默认点击不显示事件也并未生效,观察官网示例数据发现,nodes数据每条需要一个category值与categories的索引值对应。
nodes数据更改如下:

"nodes": [
      {
        "id": "0",
        "name": "Myriel",
        "draggable": true,
        "category":0
      },
      {
        "id": "1",
        "name": "Napoleon",
        "draggable": true,
        "category": 1
      },
      {
        "id": "2",
        "name": "MlleBaptistine",
         "draggable": true,
        "category": 2
      },
      {
        "id": "3",
        "name": "MmeMagloire",
        "draggable": true,
        "category": 3
      },
      {
        "id": "4",
        "name": "CountessDeLo",
        "draggable": true,
        "category": 4
      }
    ],
image.png
5.5 legend与节点间的一一对应处理

设置好nodes里的每一条category值之后,观察图片,会发现,我们有一个节点消失了,nodes有5条数据,而图中只显示了4个节点,这是为什么呢???
观察nodes的category值与categories数组发现,categories数组有四组数据,而nodes有5组数据,当ndoes的category值按照索引设置后,最大为4,此时无法与categories数组对应,因此一条数据就无法显示了,更改nodes索引值与categories一一对应就可以完美解决此问题啦,nodes最终数据为:

"nodes": [
      {
        "id": "0",
        "name": "Myriel",
        "draggable": true,
        "category":0
      },
      {
        "id": "1",
        "name": "Napoleon",
        "draggable": true,
        "category": 1
      },
      {
        "id": "2",
        "name": "MlleBaptistine",
         "draggable": true,
        "category": 2
      },
      {
        "id": "3",
        "name": "MmeMagloire",
        "draggable": true,
        "category": 3
      },
      {
        "id": "4",
        "name": "CountessDeLo",
        "draggable": true,
        "category": 3
      }
    ],
image.png

最后附echarts官网示例链接 ,以供参考:
https://echarts.apache.org/examples/zh/editor.html?c=graph

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容