vue中嵌入echarts关系图(两节点间存在多条边)

效果图如下:

      

代码如下:

<template>
    <div class="content">
   <!-- 为Echarts准备一个具备大小(宽高)的容器 -->
        <div id="myChart" style="height: 850px;margin:50px 0 auto;" ref="myChart"></div>
    </div>
</template>

<script>
    export default {
        name:'echart',
        data() {
            return {
                option:{},
            };
        },
        created(){
            this.getInitOption();
        },
        methods: {  
            // 配置图表配置项option
            getInitOption(){
                this.option = {
                    tooltip: {                                          //提示框的配置
                        formatter: function (params) {
                            if(params.dataType == "node"){
                                return params.name
                            }else if(params.dataType == "edge"){
                                return params.value
                            }
                        }
                    },
                    animationDurationUpdate: 1500,        //数据更新动画的时长   ,默认300
                    animationEasingUpdate: 'quinticInOut',   //数据更新动画的缓动效果  , 默认cubicOut
                    series: [
                        {
                            type: 'graph',                //系列类型:关系图
                            layout: 'force',    //图的布局 :none(默认不采用任何布局,使用节点中提供的 x,y作为节点位置) 
                  //                  circular(采用环形布局)
                  //                  force(采用力引导布局)
                            focusNodeAdjacency: true,   //鼠标移动到节点上时突出显示节点以及节点的边和邻接节点(高亮效果)
                            force: {                //力引导布局相关配置项
                                repulsion: 100,               //节点之间的斥力因子(关系对象间的距离) ,默认50
                                edgeLength: 500           //边的两个节点之间的距离(关系对象连接线两端对象的距离) ,默认 30 
                            },
                            itemStyle:{                         //节点样式
                                normal:{
                                    color:function(params){
                                        if(params.data.id == '0000'){     //隐藏占位点(项目需要)
                                            return 'rgb(5,14,50)'
                                        }else{
                                            return 'rgb(84,112,198)'
                                        }
                                        // return "#"+Math.floor(Math.random()*(256*256*256-1)).toString(16);
                                    },
                                    lineStyle:{
                                        color:'#999'
                                    }
                                }
                            },
          symbol: 'circle',     //标记的图形
                            symbolSize: 30, //标记的图形大小
                            roam: true,    //是否开启鼠标缩放和平移漫游,默认不开启。如果只想开启缩放或者平移,设置成  'scale'  或   'move'  。设置为 true ,为都开启。
                            label: {     //关系对象上的标签
                                show: true        //是否显示标签
                            },
                            edgeSymbol: ['circle', 'arrow'],   // 边两端的标记类型,可以是一个数组分别指定两端,也可以是单个统一指定。默认不显示标记,常见的可以设置为箭头
                            edgeSymbolSize: 8,                 //边两端的标记大小
                            edgeLabel: {        //连接两个关系对象上的线上的标签
                                normal: {
                                    show: true,                       //是否显示两个关系对象上的线上的标签
                                    textStyle: {                
                                        fontSize: 14,
                                        color:'#fff',
                                    },
                                    formatter: function(param) {        // 标签内容
                                        return param.value;
                                    }
                                }
                            },
                            data: [],    // 关系图的节点数据列表  ,注意:节点的name不能重复
                            links: [],    // 节点间的关系数据
                            lineStyle: {    // 关系边的公共线条样式
                                opacity: 0.9,
                                width: 2,
                                curveness: 0
                            }
                        }
                    ]
                }
            },
            // 初始化关系图
            drawGraph() {
                // 基于准备好的dom,初始化echarts实例
                let myChart = this.$echarts.init(this.$refs.myChart);
                // 绘制图表
                myChart.setOption(this.option,false);
            },
    //往data以及links里赋值
            getEchartsData(oneData,oneLinks,status){
     //  oneData:节点数据  oneLinks:关系数据   status:状态(项目需要,不重要)
                let that = this;
      //  如果传入状态为 3 ,layout布局采用环形布局 ,默认为力引导布局( 项目需要  )
                if(status == 3){
                    this.option.series[0].edgeSymbol = ['none','none'];
                    this.option.series[0].layout = 'circular';
       //为四个点的关系且在环形布局,要求关系线如图所示 ,多添加一个点(目的:占位置)(项目需要)
       if(status == 4){
                        let o = {
                            id: "0000",
                            name: "",
                        }
                        oneData.push(o)
                    }
                }
                // 初始化点
                oneData.map((item,index) => {
                    this.option.series[0].data.push({
                        id:item.id,
                        name:item.name
                    })
                })  
                // 初始化线
                oneLinks.map((item,index)=>{
       //设置关系连接线的曲线弧度
                    let count = 0;
                    that.option.series[0].links.map((linksItem)=>{
                        if((linksItem.source == item.fromId && linksItem.target == item.toId) || (linksItem.target == item.fromId && linksItem.source == item.toId)){
                            count ++
                        }
                    })
       //设置线上显示的值( 项目需要 )
                    item.attributes.map((val,key)=>{
                        if(val.id == 'date'){
                            item.name = item.name + " " + val.value;
                        }
                    })
                    that.option.series[0].links.push({
                        source:item.fromId,
                        target:item.toId,
                        value:item.name,
                        lineStyle: {     //设置关系边的线条样式
                            curveness: (count == 0) ? 0 : (((count%2) != 0) ? (-0.06*count) : (0.06*(count-1)))  //设置边的曲度,支持从 0 到 1 的值,值越大曲度越大 
                                              // 这样写法在环形布局下,四个点的关系时,虽然设置了弧度,但是对角线两个点之间的关系线还是会重合
                                                 // 这个问题我的解决方法:在四个点的时候,多加一个点并且把这个点隐藏(个人认为是我的写法有问题,但是又没找到,希望我的写法不要误导大家
                                            // 如果没有要求关系线如图所示 弧度可以写成 0.2*count
                        },
                    })
                })
                this.drawGraph();
            },
        },
        mounted() {
            
        },
        computed: {},
        watch: {},
    };
</script>
2、使用vantV-G6也可实现上述效果图

1、效果图

 代码如下:

  <template>
      <section>
           <div id="myChart" class="Echarts" ref="myChart" style="width: 100%; height: 100%"></div>
      </section>
     </template>
     <script>
         import G6 from '@antv/g6';
      export default {
        data () {
             return {
              data:{
                  nodes: [
                    {
                        id: 'node1',
                        x: 50,
                        y: 350,
                        label: 'A',
                    },
                    {
                        id: 'node2',
                        x: 250,
                        y: 150,
                        label: 'B',
                    },
                    {
                        id: 'node3',
                        x: 450,
                        y: 350,
                        label: 'C',
                    },
                  ],
                  edges: [],
              }
           };
        },
        mounted () {
            this.initChart();
        },
        methods: {
            initChart(){
                let that = this;
                for (let i = 0; i < 10; i++) {
                    that.data.edges.push({
                        source: 'node1',
                        target: 'node2',
                        label: `${i}th edge of A-B`,
                    });
                 }
                for (let i = 0; i < 5; i++) {
                    that.data.edges.push({
                        source: 'node2',
                        target: 'node3',
                        label: `${i}th edge of B-C`,
                    });
                }
                G6.Util.processParallelEdges(that.data.edges);
                let container = document.getElementById('myChart');
                let width = container.scrollWidth;
                let height = container.scrollHeight || 500;
                let graph = new G6.Graph({
                      container: container,
                      width,
                      height,
                      modes: {
                          default: ['drag-canvas','zoom-canvas', 'drag-node'],
                      },
                      fitCenter: true,
                      // the edges are linked to the center of source and target ndoes
                      linkCenter: true,
                      defaultNode: {
                          type: 'circle',
                          size: [40],
                          color: '#5B8FF9',
                          style: {
                              fill: '#9EC9FF',
                              lineWidth: 3,
                          },
                          labelCfg: {
                              style: {
                                  fill: '#000',
                                  fontSize: 14,
                              },
                          },
                      },
                      defaultEdge: {
                          type: 'quadratic',
                          labelCfg: {
                              autoRotate: true,
                          },
                      },
                      nodeStateStyles: {
                          // style configurations for hover state
                          hover: {
                              fillOpacity: 0.8,
                          },
                          // style configurations for selected state
                          selected: {
                              lineWidth: 5,
                          },
                      },
                });
                graph.data(that.data);
                graph.render();
            }
        },
    };
  </script>
vantV-G6网址:https://g6.antv.antgroup.com/examples

 

posted @ 2021-09-07 14:22  我爱敲代码0000  阅读(400)  评论(0编辑  收藏  举报