echarts 关系图谱配置示例

2 篇文章 0 订阅
配置项实例

 

 option = {
                grid: {
                    left: '3%',
                    right: '40%',
                    top: '30%',
                },
                itemStyle: {
                    normal: {
                        color: '#000',
                    },
                    shadowBlur: 10
                },
                legend: {
                    // data: [/* '生活场景服务', */
                    //     // '-2级',
                    //     // '-1级',
                    //     // '0级',
                    //     // '1级',
                    //     // '2级',
                    //     // '3级',
                    //     "正常用户",
                    //     "不正常用户",
                    //     "危险用户"
                    // ],
                    top: "3%",
                    right: '4%',
                    left: '80%',
                    data: th.legendArr,

                    selected: {
                        // 选中'系列1'
                        // '本人': true,
                    }
                },
                // color:  ["#f2f2f2","#ceffce",'#a2f1b7','#95c5ab','#c48827','#FF5722', '#b83d2f',      ] ,
                // color: ["#1da351", "#d06e2a", "#e2260b", '#6ad28a', '#b83d2f', '#8a6d3b', '#FF5722',],
                series: [{
                    type: 'graph',
                    layout: 'force',
                    animation: false,
                    //symbolSize:45,//节点大小
                    roam: true,//鼠标漫游(是否可以拖动)
                    legendHoverLink:true,
                    focusNodeAdjacency: true,//是否在鼠标移到节点上的时候突出显示节点以及节点的边和邻接节点。
                    //  symbol:'rect',
                    // draggable: true,//节点是否可拖拽,只在使用力引导布局的时候有用。
                    lineStyle: {
                        normal: {
                            color: 'source',
                            curveness: 0,
                            type: "dashed",
                            opacity: 0.9,
                        }
                    },
                    edgeLabel: {
                        normal: {
                            show: false,
                            textStyle: {
                                fontSize: 10,
                            },
                            formatter: "{c}"
                        }
                    },
                    label: {
                        normal: {
                            //position: 'right',//节点文字位置
                            formatter: '{b}',
                            show: false,
                            textStyle: {
                                fontSize: 9
                            },
                        }
                    },
                    data: th.dataarr
                    /*  [  {category: 5, name: "15816547842"}]  */,
                    categories: th.categories,// [
                    // {name: '-2级',},
                    // {name: '-1级',},
                    // {name: '0级',},
                    // {name: '1级',},
                    // {name: '2级',},

                    // {name: '正常用户',},
                    // {name: '不正常用户',},
                    // {name: '危险用户',},

                    // ],
                    force: {
                        repulsion: 200,
                        edgeLength: [0, 0], 值最大的边长度会趋向于 10,值最小的边长度会趋向于 50
                        gravity: 0.1,//节点受到的向中心的引力因子。该值越大节点越往中心点靠拢。
                        layoutAnimation:false,
                    },
                    links: th.linksarr
                }],


            };
前端完整脚本,只是vue格式,可简单写成普通脚本

var vm = new Vue({
    el: '#zsvm',
    data: {
        param: {//搜索参数
            mobile: null,
            uid: null,
            idCode: null,
            sonLevel:2,
        },
        echart: null,
        dataarr: [],
        linksarr: [],
        sonMin: 0,//儿子最少多少
        legendArr: [],
        categories: [],
        lengs: [20, 10, 10, 5, 10, 5, 4, 3, 2, 1],
        allMsgJSON: {},
        text: {},
        again: true,
        allMsg: {}

    },
    methods: {

        load: function (level) {//查询
            var th = this;
            th.param.level = level;

            zs_post({
                url: '../../api/consumer/relationSons?_' + $.now(),
                param: th.param,
                success: function (r) {
                    if (r.code != 0) {
                        zs_error(th, r.msg)
                        return;
                    }
                    th.allMsg = r.msg;
                    th.dealData(r.msg);
                }
            })
        },
        dealData: function () {
            // console.log(rs);
            var th = this;
            var rs = th.allMsg;
            var points = rs.points;
            var allRelations = rs.relations;

            th.again = false;
            th.again = true;
            th.linksarr = [];
            th.dataarr = [];
            th.legendArr = [];
            // th.categories=[];
            $("#relationMap").height(window.screen.height*0.4)

            for (i in points) {
                var relation = points[i];
                var len = relation.sonLength;
                if (len == null)
                    len = 0;

                if (len < th.sonMin)
                    continue;

                // var li = relation.level;
                // if (li < 0)
                //     li = -li;
                var one = {
                    id: relation.id,
                    name: relation.name,
                    category: relation.type,//relation.level + "级",
                    symbolSize: (relation.size>50?50:relation.size) + 15,//th.lengs[li]
                }

                th.allMsgJSON[relation.id] = relation;


                if (th.legendArr.indexOf(relation.type) == -1) {
                    th.legendArr.push(relation.type);
                    var colorstr = "#1da351";
                    if (relation.type.indexOf("不正常用户") != -1)
                        colorstr = "#d06e2a";
                    if (relation.type.indexOf("危险用户") != -1)
                        colorstr = "#ec1804";
                    if (relation.type.indexOf("ip") != -1)
                        colorstr = "#0b2f6c";

                    if (relation.type.indexOf("设备") != -1)
                        colorstr = "#1ab5c4";

                    if (relation.type.indexOf("游客") != -1)
                        colorstr = "#aebaba";

                    if (relation.type.indexOf("微信分享未登陆") != -1)
                        colorstr = "#a7e0bd";


                    th.categories.push(
                        {
                            name: relation.type,
                            itemStyle: {color: colorstr}
                        }
                    );
                }
                th.dataarr.push(one);
            }
            th.linksarr = allRelations;

            console.log(th.linksarr, th.dataarr)
            th.drawer()
        },

        drawer: function () {

            var th = this;

            if (this.echart == null)
                this.echart = echarts.init(document.getElementById('relationMap'));

            var myChart = this.echart;
            myChart.showLoading();

            option = {
                grid: {
                    left: '3%',
                    right: '40%',
                    top: '30%',
                },
                itemStyle: {
                    normal: {
                        color: '#000',
                    },
                    shadowBlur: 10
                },
                legend: {
                    // data: [/* '生活场景服务', */
                    //     // '-2级',
                    //     // '-1级',
                    //     // '0级',
                    //     // '1级',
                    //     // '2级',
                    //     // '3级',
                    //     "正常用户",
                    //     "不正常用户",
                    //     "危险用户"
                    // ],
                    top: "3%",
                    right: '4%',
                    left: '80%',
                    data: th.legendArr,

                    selected: {
                        // 选中'系列1'
                        // '本人': true,
                    }
                },
                // color:  ["#f2f2f2","#ceffce",'#a2f1b7','#95c5ab','#c48827','#FF5722', '#b83d2f',      ] ,
                // color: ["#1da351", "#d06e2a", "#e2260b", '#6ad28a', '#b83d2f', '#8a6d3b', '#FF5722',],
                series: [{
                    type: 'graph',
                    layout: 'force',
                    animation: false,
                    //symbolSize:45,//节点大小
                    roam: true,//鼠标漫游(是否可以拖动)
                    legendHoverLink:true,
                    focusNodeAdjacency: true,//是否在鼠标移到节点上的时候突出显示节点以及节点的边和邻接节点。
                    //  symbol:'rect',
                    // draggable: true,//节点是否可拖拽,只在使用力引导布局的时候有用。
                    lineStyle: {
                        normal: {
                            color: 'source',
                            curveness: 0,
                            type: "dashed",
                            opacity: 0.9,
                        }
                    },
                    edgeLabel: {
                        normal: {
                            show: false,
                            textStyle: {
                                fontSize: 10,
                            },
                            formatter: "{c}"
                        }
                    },
                    label: {
                        normal: {
                            //position: 'right',//节点文字位置
                            formatter: '{b}',
                            show: false,
                            textStyle: {
                                fontSize: 9
                            },
                        }
                    },
                    data: th.dataarr
                    /*  [  {category: 5, name: "15816547842"}]  */,
                    categories: th.categories,// [
                    // {name: '-2级',},
                    // {name: '-1级',},
                    // {name: '0级',},
                    // {name: '1级',},
                    // {name: '2级',},

                    // {name: '正常用户',},
                    // {name: '不正常用户',},
                    // {name: '危险用户',},

                    // ],
                    force: {
                        repulsion: 200,
                        edgeLength: [0, 0], 值最大的边长度会趋向于 10,值最小的边长度会趋向于 50
                        gravity: 0.1,//节点受到的向中心的引力因子。该值越大节点越往中心点靠拢。
                        layoutAnimation:false,
                    },
                    links: th.linksarr
                }],


            };
            myChart.setOption(option);
            myChart.hideLoading();
            myChart.on('click', function (params) {
                // 控制台打印数据的名称
                var id = params.data.id;
                if (id != undefined) {
                    th.text = th.allMsgJSON[id];
                }
            });

        },
    },
    mounted: function () {
        // this.load();
    }
})

后端查询方案和数据格式请自行设计,建议java和sql分别处理一部分逻辑,整段处理过程建议是sql查询尽量不join, 不建议只用sql(存储过程)处理,不采用读写分离情况下处理复制关系数据将影响其他业务处理,sql设计不好也有死锁的风险,这里主要分享option 配置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个示例代码,用于展示企业组织结构关系图谱: ```html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>ECharts企业组织结构关系图谱示例</title> <!-- 引入 ECharts 文件 --> <script src="https://cdn.jsdelivr.net/npm/echarts/dist/echarts.min.js"></script> </head> <body> <!-- 绘制图表的容器 --> <div id="chart" style="width: 1000px;height: 600px;"></div> <!-- 图表的 JavaScript 代码 --> <script> // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById('chart')); // 数据 var data = { "name": "公司总部", "children": [ { "name": "财务部", "children": [ { "name": "会计" }, { "name": "出纳" }, { "name": "审计师" } ] }, { "name": "人力资源部", "children": [ { "name": "人事专员" }, { "name": "薪酬专员" }, { "name": "培训专员" } ] }, { "name": "研发部", "children": [ { "name": "前端开发工程师" }, { "name": "后端开发工程师" }, { "name": "测试工程师" } ] } ] }; // 配置项 var option = { tooltip: { trigger: 'item', triggerOn: 'mousemove' }, series: [ { type: 'tree', data: [data], top: '1%', left: '7%', bottom: '1%', right: '20%', symbolSize: 7, label: { position: 'left', verticalAlign: 'middle', align: 'right', fontSize: 14 }, leaves: { label: { position: 'right', verticalAlign: 'middle', align: 'left' } }, expandAndCollapse: true, animationDuration: 550, animationDurationUpdate: 750 } ] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); </script> </body> </html> ``` 以上代码中,我们使用 ECharts 的 `tree` 类型来绘制企业组织结构关系图谱。具体来说,我们通过一个 JSON 数据来定义组织结构的层级关系,然后在配置项中设置相关参数,例如节点大小、标签位置、动画效果等,最后调用 `setOption` 方法来绘制图表。 需要注意的是,这只是一个简单的示例代码,实际情况下,我们可能需要根据具体的业务需求来调整相关参数和样式,以达到更好的可视化效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值