Echarts繪制關系圖(一)

關系圖

何為關系圖,從字面上可以看出骗爆,為關系的圖形次氨,既然為關系,那么就需要有點以及關系摘投,用來表示點與點之間的聯(lián)系煮寡。所以我們可以得出:關系圖需要兩個必要的元素虹蓄,節(jié)點,關系幸撕,其中關系需要包含有聯(lián)系的節(jié)點以及節(jié)點聯(lián)系說明薇组。因此我們首先需要將數(shù)據(jù)設計出來。

數(shù)據(jù)

節(jié)點數(shù)據(jù)

nodes:[{
  name:'節(jié)點名',
  id:'節(jié)點id'
}]

關系數(shù)據(jù)

links:[{
  relation:{
    name:'關系名稱',
    id:'關系id'
   },
  source:'關系的起點節(jié)點id',
  target:'關系的目標節(jié)點id'
}]

至此我們的數(shù)據(jù)也弄明白了坐儿,那么我們現(xiàn)在來看下echarts關系圖的制作律胀。

首先看下我們要做的關系圖的樣子
graph.png

引入Echarts

當前采用的是vue+ts模式的開發(fā)模式,故以下都將以此來說明貌矿。

yarn add echarts

由于使用的是ts.故需要引入類型說明

yarn add @types/echarts

創(chuàng)建dom節(jié)點

新建一個vue文件炭菌,新建dom節(jié)點,注意:如果dom節(jié)點沒有設置長寬逛漫,后面渲染會不出現(xiàn)黑低,因為沒有給出空間

<div id="echartsMain"></div>

基于Echarts搭建圖形基礎架子

由于echarts的架子都是差不多的,重點在于series酌毡,所以本篇文章主要在series上進行說明投储,故先復制一份常用架子,如下

myEcharts:any = null;
public initEcharts(){
   const mainDom: any = this.$el.querySelector("#echartsMain");//設置dom
   this.myEcharts = echarts.init(mainDom);//初始化echarts
   let option:any = {
        series:[]
   };
   this.myEcharts.setOption(option);
}

至此阔馋,我們一個基于echarts的圖形基礎架子搭建好了玛荞,刷新頁面,沒有報錯呕寝,dom節(jié)點也存在勋眯。那么下面就到了創(chuàng)建關系力布圖的時候了

創(chuàng)建節(jié)點

按照上圖,以及我們前面關于數(shù)據(jù)的說明下梢,我們可以先創(chuàng)建節(jié)點數(shù)據(jù)

  let nodes: Array<any> = [
        {
          name: "韋小寶",
          id: "1",
        },
        {
          name: "方怡",
          id: "2",
        },
        {
          name: "雙兒",
          id: "3",
        },
        {
          name: "茅十八",
          id: "4",
        },
        {
          name: "吳六奇",
          id: "5",
        },
      ];

將節(jié)點數(shù)據(jù)設置到力布圖上,在上面的options中增加節(jié)點

llet options:any = {
     series:[{
          nodes:nodes
        }]
      }

此時數(shù)據(jù)加上了客蹋,但是沒有顯示,是因為我們沒有設置當前圖標類型為力布圖孽江,因此在options中增加說明即可

let options:any = {
    series:[{
        type: 'graph',
        layout: 'force',
        nodes:nodes
    }]
}

那么我們就得到了如下的圖
node.png

但是這樣的話讶坯,有幾個問題,第一岗屏,節(jié)點過小辆琅,第二,不知道節(jié)點到底是哪個这刷。那么我們下一步就應該給節(jié)點增加樣式

增加節(jié)點樣式

1:設置節(jié)點的大小婉烟,以及形狀,直接在nodes數(shù)據(jù)中進行修改

   let nodes: Array<any> = [
        {
          name: "韋小寶",
          id: "1",
          symbolSize: 60,//節(jié)點大小
          symbol:'circle',//節(jié)點形狀,'circle', 'rect', 'roundRect', 'triangle', 'diamond', 'pin', 'arrow', 'none'也可'image://url'設置節(jié)點圖片
        },
        {
          name: "方怡",
          id: "2",
          symbolSize: 60,
        },
        {
          name: "雙兒",
          id: "3",
          symbolSize: 60,
        },
        {
          name: "茅十八",
          id: "4",
          symbolSize: 60,
        },
        {
          name: "吳六奇",
          id: "5",
          symbolSize: 60,
        },
      ];

修改完后頁面為
size.png

在echarts中所有的節(jié)點的樣式都是通過itemStyle來進行設置的暇屋,同樣的在力布圖中已經(jīng)可以通過itemstyle屬性進行設置節(jié)點樣式(也可以直接在nodes數(shù)據(jù)中設置單個節(jié)點的樣式哦似袁,這個可以自己去試下),同理節(jié)點上的文字顯示問題也是如此,

let options: any = {
        series: [
          {
           type: 'graph',
           layout: 'force',
            nodes: nodes,
            itemStyle: {
              color: {
                type: "radial",
                x: 0.5,
                y: 0.5,
                r: 0.5,
                colorStops: [
                  {
                    offset: 0,
                    color: "#3dd67a", // 0% 處的顏色
                  },
                  {
                    offset: 0.7,
                    color: "#3dd67a", // 0% 處的顏色
                  },
                  {
                    offset: 1,
                    color: "#95dcb2", // 100% 處的顏色
                  },
                ],
                global: false, // 缺省為 false
              },
            },
            label: {
              show: true,
              position: "bottom",
              distance: 5,
              fontSize: 18,
              align: "center",
            },
          },
        ],
      };

至此節(jié)點設置結(jié)束,頁面如下:
node-label.png

創(chuàng)建關系數(shù)據(jù)

按照最開始的圖片已經(jīng)數(shù)據(jù)說明昙衅,我們可以很明顯的將關系數(shù)據(jù)編輯出來扬霜,如下

let links: Array<any> = [
        {
          source: "1",
          target: "2",
          relation: {
            name: "老婆",
            id: "1",
          },
        },
        {
          source: "1",
          target: "3",
          relation: {
            name: "老婆",
            id: "1",
          },
        },
        {
          source: "1",
          target: "4",
          relation: {
            name: "兄弟",
            id: "1",
          },
        },
        {
          source: "4",
          target: "1",
          relation: {
            name: "兄弟",
            id: "1",
          },
        },
        {
          source: "3",
          target: "5",
          relation: {
            name: "義妹",
            id: "1",
          },
        },
      ];

力布圖添加關系

在options中增加關系數(shù)據(jù),如下

let options: any = {
        series: [
          {
            type: 'graph',
            layout: 'force',
            nodes: nodes,
            links:links,
            itemStyle: {
              color: {
                type: "radial",
                x: 0.5,
                y: 0.5,
                r: 0.5,
                colorStops: [
                  {
                    offset: 0,
                    color: "#3dd67a", // 0% 處的顏色
                  },
                  {
                    offset: 0.7,
                    color: "#3dd67a", // 0% 處的顏色
                  },
                  {
                    offset: 1,
                    color: "#95dcb2", // 100% 處的顏色
                  },
                ],
                global: false, // 缺省為 false
              },
            },
            label: {
              show: true,
              position: "bottom",
              distance: 5,
              fontSize: 18,
              align: "center",
            },
          },
        ],
      };

此時頁面展示情況如下:
關系.png

多個關系處理

從上面的圖形以及數(shù)據(jù)中而涉,我們可以看到著瓶,其實茅十八和韋小寶互相為兄弟關系的,但是上圖中沒有顯示婴谱,如果我們?nèi)タ磀om節(jié)點,我們可以看到其實茅十八和韋小寶間有兩條線躯泰,但是由于兩間之間直線距離最短谭羔,所以echarts就直接給重合了,那么我們怎么解決呢麦向,最簡單的方式將重疊的線變成曲線瘟裸,因此在options中增加曲線率即可

let options: any = {
        series: [
          {
            type: 'graph',
            layout: 'force',
            nodes: nodes,
            links:links,
            itemStyle: {
              color: {
                type: "radial",
                x: 0.5,
                y: 0.5,
                r: 0.5,
                colorStops: [
                  {
                    offset: 0,
                    color: "#3dd67a", // 0% 處的顏色
                  },
                  {
                    offset: 0.7,
                    color: "#3dd67a", // 0% 處的顏色
                  },
                  {
                    offset: 1,
                    color: "#95dcb2", // 100% 處的顏色
                  },
                ],
                global: false, // 缺省為 false
              },
            },
            label: {
              show: true,
              position: "bottom",
              distance: 5,
              fontSize: 18,
              align: "center",
            },
            autoCurveness: 0.01, //多條邊的時候,自動計算曲率
          },
        ],
      };

此時頁面展示為
image.png

增加關系說明以及指向

let options: any = {
        series: [
          {
            type: 'graph',
            layout: 'force',
            nodes: nodes,
            links: links,
            itemStyle: {
              color: {
                type: "radial",
                x: 0.5,
                y: 0.5,
                r: 0.5,
                colorStops: [
                  {
                    offset: 0,
                    color: "#3dd67a", // 0% 處的顏色
                  },
                  {
                    offset: 0.7,
                    color: "#3dd67a", // 0% 處的顏色
                  },
                  {
                    offset: 1,
                    color: "#95dcb2", // 100% 處的顏色
                  },
                ],
                global: false, // 缺省為 false
              },
            },
            label: {
              show: true,
              position: "bottom",
              distance: 5,
              fontSize: 18,
              align: "center",
            },
            autoCurveness: 0.01, //多條邊的時候诵竭,自動計算曲率
            edgeLabel: {//邊的設置
              show: true,
              position: "middle",
              fontSize: 12,
              formatter: (params) => {
                return params.data.relation.name;
              },
            },
            edgeSymbol: ["circle", "arrow"], //邊兩邊的類型
          },
        ],
      };

此時頁面展示為
image.png

此時一個關系圖的最基本的設置就配置完成了话告。

ps:可能各位按照代碼敲出來的頁面長這樣
image.png

此時我們看圖可以看到,所有的節(jié)點都挨著卵慰,所以說明節(jié)點間沒有排斥力沙郭,同時關系間的線的長度都沒有設置,因此直接在options增加相應的設置即可裳朋,最終的options如下
let options: any = {
        series: [
          {
            type: 'graph',
            layout: 'force',
            nodes: nodes,
            links: links,
            itemStyle: {
              color: {
                type: "radial",
                x: 0.5,
                y: 0.5,
                r: 0.5,
                colorStops: [
                  {
                    offset: 0,
                    color: "#3dd67a", // 0% 處的顏色
                  },
                  {
                    offset: 0.7,
                    color: "#3dd67a", // 0% 處的顏色
                  },
                  {
                    offset: 1,
                    color: "#95dcb2", // 100% 處的顏色
                  },
                ],
                global: false, // 缺省為 false
              },
            },
            label: {
              show: true,
              position: "bottom",
              distance: 5,
              fontSize: 18,
              align: "center",
            },
            autoCurveness: 0.01, //多條邊的時候病线,自動計算曲率
            edgeLabel: {//邊的設置
              show: true,
              position: "middle",
              fontSize: 12,
              formatter: (params) => {
                return params.data.relation.name;
              },
            },
            edgeSymbol: ["circle", "arrow"], //邊兩邊的類型
            force: {
              repulsion: 100,
               gravity:0.01,
                edgeLength:200
           }
          },
        ],
      };

附加echarts力布圖配置鏈接
https://echarts.apache.org/zh/option.html#series-graph.type
下一章將會實現(xiàn)節(jié)點拖拽后固定,以及文字隨縮放而變化以及將某個指定的節(jié)點定位到視圖中間

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鲤嫡,一起剝皮案震驚了整個濱河市送挑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌暖眼,老刑警劉巖惕耕,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诫肠,居然都是意外死亡司澎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門栋豫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來惭缰,“玉大人,你說我怎么就攤上這事笼才∈埽” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長昂羡。 經(jīng)常有香客問我絮记,道長,這世上最難降的妖魔是什么虐先? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任怨愤,我火速辦了婚禮,結(jié)果婚禮上蛹批,老公的妹妹穿的比我還像新娘撰洗。我一直安慰自己,他們只是感情好腐芍,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布差导。 她就那樣靜靜地躺著,像睡著了一般猪勇。 火紅的嫁衣襯著肌膚如雪设褐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天泣刹,我揣著相機與錄音助析,去河邊找鬼。 笑死椅您,一個胖子當著我的面吹牛外冀,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播掀泳,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼锥惋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了开伏?” 一聲冷哼從身側(cè)響起膀跌,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎固灵,沒想到半個月后捅伤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡巫玻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年丛忆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仍秤。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡熄诡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诗力,到底是詐尸還是另有隱情凰浮,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站袜茧,受9級特大地震影響菜拓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笛厦,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一纳鼎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裳凸,春花似錦贱鄙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至菠秒,卻和暖如春疙剑,著一層夾襖步出監(jiān)牢的瞬間氯迂,已是汗流浹背践叠。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留嚼蚀,地道東北人禁灼。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像轿曙,于是被迫代替她去往敵國和親弄捕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容