echarts实现关系网络图,单个节点可无限扩散,方便实用易懂

应该是至少半年了,从18年年底到现在接触的项目基本都是图谱项目,图谱项目就是尽可能的用图的形式来展示数据,所以关于echarts这个东西,也算是接触的不少了,早就想记录一些工作中关于echarts遇到的问题和 笔记,方便自己也方便大家,时间问题拖到现在,所以就赶紧写一写吧。

这个博客主要记录一个比较完整的关系网络图如果同学你也是在做这种图就可以继续往下看吧,如果不是需要这样的,也可以看一些属性啊记录,希望对大家也有所帮助;

先来一张效果图

这个图呢就是中间一个点 ,扩散出去,扩散出去的每个点可以继续扩散;示例数据如下:

var myGraphData = [
        { "parentNode":"张三", "childNodes":["小明", "小华", "小杰", "小婷"]},
        { "parentNode":"小明", "childNodes":[ "小王", "小赵", "小钱" ] },
        { "parentNode":"小华", "childNodes":[ "小孙", "小李"] },
        { "parentNode":"小华", "childNodes":[  "小周"] },
        { "parentNode":"小杰", "childNodes":[ "小吴", "小郑" ] },
        { "parentNode":"小婷", "childNodes":[ "小谢" ] },
        { "parentNode":"小婷", "childNodes":[ "小潘" ] },
   //数据格式是这样的,parentNode是souce出发点,childNodes就是parentNode所扩散出的点,也就是目标点也叫子节点;只要把数据造成这样就ok直接使用了;
    ];

实际后台数据如下:后台没有按规则来进行返回,所以就在页面中处理了;from是 出发点id+name,to是目标点id+name;

开始代码

html页面

     <div id="personKeywordsYearListGraphDiv"
        style="width: 100%; height: 500px">
     </div>

js画图代码

function doPersonAnalyseNetwork(resData){
    var dataPre = resData.noeds;
    //判断数据是否存在,如果不存在则将div直接隐藏
    if(null ==dataPre || "" == dataPre || dataPre.length == 0 ){
        $("#hezuoPersonTuDiv").hide();
        return false;
    }
    var chart = document.getElementById('personKeywordsYearListGraphDiv');
    chart.removeAttribute("_echarts_instance_");//加上这句表示情况重复数据,二次加载清空原始数据
    myChart = echarts.init(chart);

    myChart.showLoading({
        text: '数据正在努力加载...',
        textStyle: { fontSize : 30 , color: '#444' },
        effectOption: {backgroundColor: 'rgba(0, 0, 0, 0)'}
    });
                if (dataPre.length === 0){}
                //alert('暂未检索到该科研人员的合作网络,请稍候再试。');
                else {
                    var arrr = [];
                    //数据格式:
                    // var myGraphData = [
                    //     { "parentNode":"张三", "childNodes":["小明", "小华", "小杰", "小婷","小妍","小飞"]},
                    //     { "parentNode":"小明", "childNodes":[ "小王", "小赵", "小钱" ] },
                    //     { "parentNode":"小华", "childNodes":[ "小孙", "小李", "小周" ] },
                    // ];
                    //创建dataNodes来存放数据
                    var dataNodes = {};
                    dataNodes.parentNode = {};
                    dataNodes.childNodes = [];
                    dataNodes.childNodesId = [];
                    //当前用户的name
                    var personName =resData.personInfo.personName;
                    dataNodes.parentNode  = personName;
                    for (var n = 0; n < dataPre.length; n++) {
                        if (dataPre[n].group == 0){
                            //group为0的是当前直接关系的节点
                            dataNodes.childNodes.push(dataPre[n].to.split('-')[1]);
                            //存放name和id的信息,中间用“-”进行分割;
                            dataNodes.childNodesId.push(dataPre[n].from.split('-')[0]+"-"+dataPre[n].to.split('-')[0]);

                        }
                    }
                    //以上代码为当前用户节点和直接关系节点的数据
                    arrr.push(dataNodes);
                    dataNodes = {};
                    dataNodes.parentNode = {};
                    dataNodes.childNodes = [];
                    dataNodes.childNodesId = [];

                    for (var n = 0; n < dataPre.length; n++) {
                        //开始处理group为1的数据,表示间接关系
                        if (dataPre[n].group == 1){
                            dataNodes.parentNode  = dataPre[n].from.split('-')[1];
                            //因数据有重复性,id又不可重复,所以此处采用循环中的n+name+id的方式来保证唯一  使用的时候在来进行分割获取
                            //这里保存的target目标的name和id
                            dataNodes.childNodes.push(n+"-"+dataPre[n].to.split('-')[1]+"-"+dataPre[n].to.split('-')[0]);
                            //本行代码与上行代码意思一直,重复是为了直接将当前的source和taeget的id进行保存,方便使用
                            dataNodes.childNodesId.push(dataPre[n].from.split('-')[0]+"-"+dataPre[n].to.split('-')[0]);
                            arrr.push(dataNodes);
                            dataNodes = {};
                            dataNodes.parentNode = {};
                            dataNodes.childNodes = [];
                            dataNodes.childNodesId = [];
                        }
                    }
                    var myGraphData =arrr;
                    var listdata = [];
                    var linksdata = [];
                    var nodes =[{
                        "nodename":personName,
                        "nodelevel":0,
                        "parentnode":0,
                        "nodeId":"",
                    }];
                    for(var i=0; i < myGraphData.length; i++){
                        getNodes(myGraphData[i].parentNode,myGraphData[i].childNodes,myGraphData[i].childNodesId,nodes);
                        //创建source和target 的信息
                        setLinkData( myGraphData[i].childNodes, myGraphData[i].parentNode,myGraphData[i].childNodesId, linksdata);
                    }
                    setNodeData(nodes,listdata);

                    var levels = 0;
                    var legend_data = [];
                    var series_categories = [];
                    var temp = ["","直接关系","间接关系"];//第一个为空,空的原因请看下方的for循环,这个是在初始化图例
                    for(var i=0; i < nodes.length; i++){
                        levels = Math.max(levels, nodes[i].nodelevel);
                    }
                    for(var i=0; i<=levels; i++){

                        legend_data.push({
                            name : i===0?'中心点':temp[i],
                            icon : 'rect'
                        });

                        series_categories.push({
                            name : i===0?'中心点':temp[i],
                            symbol : 'rect'
                        });

                    }

                    option = {
                        title: {
                            text: personName+"人员合作网络",
                            top: "top",
                            left: "left",
                            textStyle: {
                                color: '#292421'
                            }
                        },
                        tooltip: {
                            formatter: '{b}'
                        },
                        backgroundColor: '#FFFFFF',
                        legend: {
                            show : true,
                            data : legend_data,
                            textStyle: {
                                color: '#292421'
                            },
                            type: 'scroll',
                            orient: 'vertical',
                            left: 'left',
                            top: '40px'

                        },
                        toolbox: {
                            show: true,
                            feature: {

                                saveAsImage: {show: true} //支持下载的按钮
                            }
                        },
                        animationDuration: 0,
                        animationEasingUpdate: 'quinticInOut',
                        series: [{
                            color: [
                                '#fc0','#36c' ,'#FF8C69'
                            ],
                            name: '关系图',
                            type: 'graph',
                            layout: 'force',
                            force: {
                                repulsion: 300,
                                gravity: 0.1,
                                edgeLength: 15,
                                layoutAnimation: true,
                            },
                            data: listdata,
                            links: linksdata,
                            categories: series_categories,
                            roam: true,
                            label: {
                                normal: {
                                    show: true,
                                    position: 'bottom',
                                    formatter:function(param){
                                        return param.data.trueName; //自定义节点的显示名称,默认是name
                                    },
                                    fontSize: 10,
                                    fontStyle: '600',
                                }
                            },
                            lineStyle: {
                                normal: {
                                    opacity: 0.9,
                                    width: 0.5,
                                    curveness: 0
                                }
                            }
                        }]
                    };
                    myChart.setOption(option, true);
                    myChart.hideLoading();
                    myChart.on('click', function (params) {
                        var nodeId1, nodeId2;
                        if(params.dataType === 'edge'){ //edge表示点击的是线
                            //在link中已经保存好source和target 包括target的id和targetId的id
                            nodeId1 = params.data.source;
                            if (params.data.target.split("-").length > 2){
                                nodeId2 = params.data.target.split("-")[1];
                            } else {
                                nodeId2 = params.data.target;
                            }
                            var  targetId = params.data.targetId;
                            var personCodeNumOne = personIDThis;
                            var queryJson = {
                                "queryStr":nodeId1 + '-' + nodeId2,
                                "queryStrCode":personCodeNumOne + '-' + targetId,
                                "coNum":2,
                                "pageNum":0,
                                "pageSize":5,
                                "queryType":"person"
                            };
                            $('#textDiv').html('<h5>' + nodeId1 + ' 与 ' + nodeId2 + ' 的合作情况:' + '</h5>');
                            getAllCData(queryJson);
                            $('#cooRDiv').css('display', 'block');
                        }
                        else if(params.dataType === 'node'){//node表示点击的是节点
                            if(params.data.group != '0'){
                                var win = window.open( "/baseQuery/personDetail/" + params.data.trueId );
                                if ( win == null )
                                    window.alert( "请不要启用弹出式窗口拦截" );
                            }
                        }
                    });

                    //获取group为0的信息,表示直接与中间点合作的人员
                    var groupFirst = [];
                    for (var c = 1; c < dataPre.length; c++) {
                        if (dataPre[c].group == 0){
                            groupFirst.push(dataPre[c]);
                        }
                    }
                    var cooNum = groupFirst.length;
                    var analyseResultContent = '<div class="row"><div class="col-md-12">';
                    if (groupFirst.length === 1) {
                        analyseResultContent += '<p><span style="font-size: larger; color: #2e6da4">' + $('#personName').val().split(',')[0] + '</span>&nbsp; 和任何科研人员都没有过合作。</p>';
                    }
                    else {
                        var maxPersonName = '';
                        var maxPersonNum = 0;
                        for (var m = 0; m < cooNum; m++) {
                            if (groupFirst[m].count >= maxPersonNum) {
                                maxPersonName = groupFirst[m].to.split("-")[1];
                                maxPersonNum = groupFirst[m].count;
                            }
                        }
                        var minPersonName = '';
                        var minPersonNum = 1;
                        for (m = 0; m < cooNum; m++) {
                            if (groupFirst[m].count <= minPersonNum) {
                                minPersonName = groupFirst[m].to.split("-")[1];
                                minPersonNum = groupFirst[m].count;
                            }
                        }
                        analyseResultContent += '<p><span style="font-size: larger; color: #2e6da4">' + personName + '</span>&nbsp;与&nbsp;<span style="font-size: larger; color: #ac2925">' + cooNum + '</span>&nbsp;个科研人员有合作关系;';
                        analyseResultContent += '与&nbsp;<span style="font-size: larger; color: #843534">' + maxPersonName + '</span>&nbsp;关系最为紧密,合作关系数量为&nbsp;<span style="font-size: larger; color: #ac2925">' + maxPersonNum + '</span>;';
                        analyseResultContent += '与&nbsp;<span style="font-size: larger; color: #02c66c">' + minPersonName + '</span>&nbsp;关系最为稀疏,合作关系数量为&nbsp;<span style="font-size: larger; color: #ac2925">' + minPersonNum + '</span>;</p>';
                        analyseResultContent += '<p>鼠标放在节点上可查看该人员参与分析的科研人员数量,放在连线上可查看两个人员的关系数量值。</p>';
                    }
                    analyseResultContent += '</div></div>';
                    $('#personNetworkAnalyseContent').html(analyseResultContent);

                }


}

好了,所有代码就是如上,如有问题还请留言,或者加qq:983469079进行探讨;

如果对您有帮助记得点个赞哟~ 

 

<think>好的,用户想了解生成网络架构图的相关内容。我需要先明确用户的需求是什么。他们可能是在进行软件开发、系统设计,或者需要展示现有的网络结构。首先,我应该解释网络架构图的基本概念,确保用户理解其用途和重要性。 接下来,用户可能需要具体的步骤指导,所以需要分步骤说明生成网络架构图的过程。步骤通常包括确定需求、选择工具、设计元素、绘制、验证和文档化。每个步骤需要详细说明,比如工具方面,可以推荐常见的工具如Visio、Lucidchart、Draw.io,以及文本工具如PlantUML和Mermaid,甚至编程库如Graphviz。 然后,用户可能关心实际案例,这样他们能更好地理解如何应用这些步骤。举个例子,比如设计一个微服务架构,需要包含哪些组件,如何连接,这样的例子能帮助用户直观地看到架构图的构成。 另外,用户可能不知道有哪些工具适合他们,需要根据不同的使用场景推荐工具,比如非技术人员可能更适合图形化工具,而开发人员可能更喜欢代码生成的方式。同时,注意事项部分可以帮助用户避免常见错误,比如过于复杂或忽略关键细节。 最后,总结一下关键点,强调架构图的重要性和生成流程,确保用户有一个清晰的思路。需要检查是否覆盖了所有必要的信息,语言是否清晰易懂,避免使用过于专业的术语,但又要保持准确性。可能需要调整结构,确保逻辑流畅,步骤明确,示例具体,这样用户能一步步跟着操作。</think>生成网络架构图的步骤及方法详解: 一、网络架构图的核心作用 1. 可视化呈现:将复杂的网络组件、连接关系和层级结构图形化展示 2. 设计辅助:帮助规划系统拓扑、接口协议、数据流向等关键要素 3. 沟通协作:统一技术团队和利益相关者对系统架构的认知 二、生成流程(6步法) $$流程:需求分析 \rightarrow 工具选择 \rightarrow 元素设计 \rightarrow 绘图实施 \rightarrow 验证优化 \rightarrow 文档输出$$ 1. 需求确认阶段 - 明确架构类型:物理网络/逻辑架构/部署架构/微服务架构 - 确定展示维度:OSI分层模型/功能模块划分/数据流向 - 收集必要信息: $$IP地址段分配表\subseteq 网络配置$$ $$API接口规范\subseteq 系统交互文档$$ 2. 工具选型建议 | 工具类型 | 代表工具 | 适用场景 | |----------------|--------------------------|----------------------------| | 图形化工具 | Visio, Lucidchart | 传统网络架构设计 | | 在线协作工具 | Draw.io, FigJam | 团队实时协作 | | 文本绘图工具 | PlantUML, Mermaid | 开发文档嵌入 | | 编程生成工具 | Graphviz, NetworkX | 自动化生成复杂拓扑 | 3. 核心绘图规范 - 图标标准化: $$服务器节点 \equiv \square$$ $$网络设备 \equiv \bigcirc$$ $$安全设备 \equiv \triangle$$ - 连接线规范: ```mermaid graph LR A[服务A] -- HTTP/1.1 --> B{负载均衡} B --> C[服务B-v1] B --> D[服务B-v2] ``` 4. 典型架构图示例(以微服务为例) ``` +-----------------+ | API Gateway | +--------+--------+ | v +-------------+ +------------+-------------+ | Service A +<----->+ Service Discovery (Eureka) | +-------------+ +------------+-------------+ ^ | +--------+--------+ | Config Server | +-----------------+ ``` 三、关键技术要点 1. 分层设计原则: $$物理层\subset 数据链路层\subset 网络层\subset 传输层\subset 应用层$$ 2. 标注规范: - 端口号标注:`10.0.0.1:8080` - 协议标注:`gRPC/HTTP2` - 带宽标注:`1Gbps` 四、常见错误规避 1. 避免过度复杂:单个视图不超过50个元素 2. 版本控制:使用`git`管理架构图迭代 3. 动态更新机制:建立架构图与基础设施代码(IaC)的同步关系 五、进阶技巧 1. 自动化生成:通过Terraform生成AWS架构图 ```hcl resource "aws_vpc" "main" { cidr_block = "10.0.0.0/16" } ``` 2. 交互式架构图:使用D3.js实现可点击查看详情的Web版架构 建议根据具体项目需求选择合适的工具和方法,建议从简单的Visio或Draw.io开始实践,逐步过渡到自动化生成工具。保持架构图与实际系统版本的一致性至关重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值