需要做一个树形图,可以查看各个人员的关系。

可伸缩的力引导图-失败

刚开始,打算做一个可展开和伸缩的,搜索时候发现CSDN有一篇美美哒程序媛写的Echarts Force力导向图实现节点可折叠。

这里放上前辈的代码

/**

这段代码来自 http://blog.csdn.net/r4NqiAn/article/details/48320487

Echarts-Force

力导向布局图树状结构实现节点可折叠效果

作者:Reese

日期:2015-09-09

版本:V0.1

功能:点击一次节点,展开一级子节点;再次点击节点,折叠所有子孙节点;

弹出最终子节点的标签

备注:在使用该方法的时候,在nodes的属性里要自定义flag属性,并设置ignore*/

var ecConfig = require('echarts/config');functionopenOrFold(param){var linksNodes=[];//中间变量

var data=param.data;//表示当前选择的某一节点

var option = myChart.getOption();//获取已生成图形的Option

var nodesOption=option.series[0].nodes;//获得所有节点的数组

var linksOption=option.series[0].links;//获得所有连接的数组

var categoryLength=option.series[0].categories.length;//获得类别数组的大小

/**

该段代码判断当前节点的category是否为最终子节点,

如果是,则弹出该节点的label*/

if(data.category==(categoryLength-1)){

alert(data.label);

}/**判断是否选择到了连接线上*/

if(data != null && data !=undefined){/**

判断所选节点的flag

如果为真,则表示要展开数据,

如果为假,则表示要折叠数据*/

if(data.flag) {/**

遍历连接关系数组

最终获得所选择节点的一层子节点*/

for(var m inlinksOption){//引用的连接关系的目标,既父节点是当前节点

if(linksOption[m].target==data.id){

linksNodes.push(linksOption[m].source);//获得子节点数组

}

}//for(var m in linksOption){...}

/**

遍历子节点数组

设置对应的option属性*/

if(linksNodes != null && linksNodes !=undefined){for(var p inlinksNodes){

nodesOption[linksNodes[p]].ignore= false;//设置展示该节点

nodesOption[linksNodes[p]].flag = true;

}

}//设置该节点的flag为false,下次点击折叠子孙节点

nodesOption[data.id].flag = false;//重绘

myChart.setOption(option);

}else{/**

遍历连接关系数组

最终获得所选择节点的所有子孙子节点*/

for(var m inlinksOption){//引用的连接关系的目标,既父节点是当前节点

if(linksOption[m].target==data.id){

linksNodes.push(linksOption[m].source);//找到当前节点的第一层子节点

}if(linksNodes != null && linksNodes !=undefined){for(var n inlinksNodes){//第一层子节点作为父节点,找到所有子孙节点

if(linksOption[m].target==linksNodes[n]){

linksNodes.push(linksOption[m].source);

}

}

}

}//for(var m in linksOption){...}

/**

遍历最终生成的连接关系数组*/

if(linksNodes != null && linksNodes !=undefined){for(var p inlinksNodes){

nodesOption[linksNodes[p]].ignore= true;//设置折叠该节点

nodesOption[linksNodes[p]].flag = true;

}

}//设置该节点的flag为true,下次点击展开子节点

nodesOption[data.id].flag = true;//重绘

myChart.setOption(option);

}//if (data.flag) {...}

}//if(data != null && data != undefined){...}

}//function openOrFold(param){...}

myChart.on(ecConfig.EVENT.CLICK, openOrFold);

看了一下,思路很清晰。然后开始做,发现她的这代码有个问题就是折叠如果多层会有折叠不上的情况,也可能是我自己代码的原因。

需注意

1.在Echarts3中没有ignore属性,我发现data[].category如果对应值不存在的话,就会不显示节点,所以,再点击的时候设置子节点x.category=x.category*-1;就可隐藏,显示时候同样反转就行。有需要特殊隐藏稍加一点判断就行。

nodesOption[linksNodes[p]].category = nodesOption[linksNodes[p]].category*-1;

2.不用多加自定义属性去折叠了,隐藏了就折叠了,但是得获取到递归获取到所有子id。这里还有些残留的代码片段

//先判断是要展开还是闭合:如果有一个category为正,则闭合;否则扩展一层 。

expend=true;for ( var p inlinksNodes) {if(nodesOption[linksNodes[p]].category>0 ){ //&& !is_exist(linksOption,nodesOption,nodesOption[linksNodes[p]].id)

expend=false;

nodesOption[linksNodes[p]].category=Math.abs(nodesOption[linksNodes[p]].category)*-1;

}

nodesOption[linksNodes[p]].category=Math.abs(nodesOption[linksNodes[p]].category)*-1; //顺便使所有的值一致,全置为负值。因为关闭全关闭,展开只展开一层(特例)下面做处理就好、

//console.log(p+':'+nodesOption[linksNodes[p]].category)

}if(expend){ //展开 一层

linksNodeArrs=[];

linksNodes_in=get_id(linksOption,data.id,0);//console.log(linksNodes_in)

for ( var p inlinksNodes_in) {

nodesOption[linksNodes_in[p]].category= nodesOption[linksNodes_in[p]].category*-1;

}

}else{ //闭合不需要做处理

}//递归取所有 id

function get_id(arr,cId,f=1){for ( var m inarr) {if (arr[m].source ==cId) {

linksNodeArrs.push(arr[m].target);//linksNodeArrs.push(m);

//console.log(arr[m].target);

if(f)

get_id(arr,arr[m].target);

}

}returnlinksNodeArrs;

}

图一为简单的扩展折叠,完美

图二为有问题的折叠,点击[设计师B]时,[项目1]和[厂商D]应该存在,因为还有别的路径,逻辑错误,这里要弄折叠肯定得通过有向图比较好解决。不过这里暂时用不到,以后有机会填此坑。

那么,不考虑折叠了,考虑单击出相关一级子节点,双击只显示此节点的第一级。

可扩展,以及单独显示的力引导图

为了以后需要查数据库动态获取数据,所以暂时把关系都存到数据库里。主要有两组数据,一组是每个节点(数据),一组是他们的关系即连接线 。有人可能会想,这想一种数据结构,对,这就是有向图 :

扯回来,代码只是演示相关功能并不完善,这里将不详细介绍各代码,只是简单的取数据库而已,Echarts基础请看官方文档和技术文章。

数据库简单设计三个,categories各分类,nodes数据节点,links边(可以看到保存了关系)

TP代码:

#查询最基本的显示

public functionindex(){####分类查询####

$category=M('categories')->field('name')->where('name is not null')->order('id asc')->select();//注:需要从0排起

//legend,页顶部的标签 -可空

$legend_data=' ';foreach($category as $v){$legend_data.="'{$v['name']}',";

}$legend_data=substr($legend_data,0,-1);$this->assign('legend_data',$legend_data);//分类,与legend同数据

$json_cate=json_encode($category,JSON_NUMERIC_CHECK);$this->assign('json_cate',$json_cate);####连接查询#### 查询第一层

$links_data=M('links')->field('source,target,value,id as id_')->order('id asc')->where('source=0')->select();//

$id_str='0,';foreach($links_data as $v){$id_str.="{$v['target']},";

}$id_str=substr($id_str,0,-1);$links_data2=M('links')->field('source,target,value,id as id_')->order('id asc')->where(" `source` in (%s) ",$id_str)->select();foreach($links_data2 as $k=>$v){$links_data[]=$v;

}$json_links=json_encode($links_data);$this->assign('json_links',$json_links);####数据查询####

$where=array();$where['id']=array('in',$id_str);$nodes_data=M('nodes')->field('id,name,category')->order('id asc')->where($where)->select();$json_nodes=json_encode($nodes_data,JSON_NUMERIC_CHECK);//echo $json_nodes;

$this->assign('json_nodes',$json_nodes);$this->display();

}public functiononly_show(){ //only_show函数等下点击节点时候ajax用。$selfid=I('post.id');####连接查询####

$map=array();$map['_query'] = "source=$selfid&target=$selfid&_logic=or";$links_data=M('links')->field('source,target,value')->order('id asc')->where($map)->select();$id_str=' ';foreach($links_data as $v){$id_str.="{$v['target']},";$id_str.="{$v['source']},";

}$id_str=substr($id_str,0,-1);$links_data=M('links')->field('source,target,value,id as id_')->order('id asc')->where(" `source` in (%s) or `target` in (%s) ",$id_str,$id_str)->select();$json_links=json_encode($links_data);$result['json_links']=$json_links;####数据查询####

$where['id']=array('in',$id_str);$nodes_data=M('nodes')->field('id as id,name,category')->order('id asc')->where($where)->select();$json_nodes=json_encode($nodes_data,JSON_NUMERIC_CHECK);$result['json_nodes']=$json_nodes;$this->ajaxReturn($result);

}

视图代码:

1

2

3

4

关系图试验

5

6

7

8

9

10

11

echart关系树状图_Echarts关系图-力引导布局相关推荐

  1. echart关系树状图_echart——关系图graph详解

    VueEchart组件见上一篇 export default { data () { const title = { // show: true, //是否显示 text: "画布关系图&q ...

  2. 项目管理树状组织结构思维导图怎样绘制

    思维导图的种类是很多的,不同的主题要选择不同的框架结构以及绘制方法,这样有利于洪作的进行,并且熟练掌握不同结构思维导图的绘制可以对让我们在学到不同的知识点,下面是分享的项目管理树状组织结构思维导图的绘 ...

  3. 数据库树状结构的关系表的删除方案

    所谓的树状结构的关系,即是记录之间有id,parentId关系的数据.场景是这样的:业务中用到了一张分享表,表里的主要字段有分享人,和被分享人,以及分享任务ID,可以通过一系列的分享构造成树状的结构, ...

  4. echart关系树状图_干货 | 25个常用Matplotlib图的Python代码

    50个Matplotlib图的汇编,在数据分析和可视化中最有用.此列表允许您使用Python的Matplotlib和Seaborn库选择要显示的可视化对象. 1.关联 散点图 带边界的气泡图 带线性回 ...

  5. CoreAnimation图层的树状结构和寄宿图

    1.图层的树状结构 Core Animation的前身叫做Layer Kit,所以,你应该意识到Core Animation并不只是用来做动画的.做动画只是Core Animation特性的冰山一角. ...

  6. echart关系树状图_在vue中使用echart创建树形图

    1.引入echart模块 可以选择全部引入或者只引入所用组件,这里为了方便选择全部引入: import echarts from 'echarts' 2.定义树形图的data data() { ret ...

  7. echart关系树状图_echart.js制作树状图饼状图;

    // Step:3 conifg ECharts's path, link to echarts.js from current page. // Step:3 为模块加载器配置echarts的路径, ...

  8. Java接口关系树状图

    圆形:接口 矩形:表示对象 向上的蓝色箭头:接口继承关系 乡下的蓝色箭头:依赖关系

  9. visualmap折线图_echarts折线图实现切断效果

    需求描述: 折线图如果相邻的两个值都是0则不显示这一段水平折线. 分析 如果折线图上的数值为0会在,x轴有一段水平线,如果能将这段隐藏就达到了折线图切割的效果. echarts中有个折线图渲染属性 v ...

最新文章

  1. 科学说忘记一个人只要七年
  2. 一上来,就问原理,问上亿(MySQL)大表的索引优化...
  3. python 双向链表_数据结构-双向链表(Python实现)
  4. 浅谈WebKit之WebCore
  5. 银联高校极客挑战赛 初赛 第一场、第二场合集(3+3题)
  6. 如何让你的 JS 写得更漂亮,看这篇就对了!
  7. linux密码stdin怎么用,如何使ssh接收来自stdin的密码
  8. linux共享软件_为什么 linux 要用 tar.gz,很少用 7z 或 zip?
  9. 还款压力大要不要买房?
  10. mysql中的where 1 1_SQL语句中where 1=1和where 1=0的作用
  11. c语言编程题题库及详解答案,C语言编程题及答案.pdf
  12. JavaScript之浏览器大战
  13. 印象笔记中可以使用html语言吗,印象笔记支持markdown啦
  14. 微信小程序 自定义标题栏
  15. Ubuntu进行apt-get出现Package xxx is not available,but is referred to by another package错误
  16. 人的一生,到底在追求什么?
  17. UE4 Gate效果
  18. java 读取pdf签名域_Java给PDF签名
  19. 第五章.系统安全分析与设计
  20. 四旋翼无人机学习第15节--PCB Editor简单绘制封装-手动绘制封装

热门文章

  1. html5翻卡片游戏,用 JavaScript 写一个卡片小游戏
  2. 不让html缓存图片吗,html – 如何强制Web浏览器不缓存图像
  3. linux静态反汇编工具,源码恢复反汇编静态分析工具IDA pro
  4. linnux 流量控制模块tc_FS4008-40-08-CV-A气体质量流量计【汉川仪器】阿坝资讯
  5. 用正则将html中的url提取,使用正则表达式从HTML中提取文本和链接
  6. python多线程_干货|理解python多线程和多进程
  7. 你在寻觅冬季唯美的海报设计素材么?
  8. 感性精品高清PSD美手分层海报,一键替换,奢华品、首饰、护肤品推荐临摹应用
  9. 免费UI圆角字体素材|字体设计密码:字形设计中“圆角”的应用规范
  10. 如何低格台式计算机的硬盘,硬盘怎样低级格式化