使用d3.v3插件绘制出svg图
众所周知,这个插件使用的svg技术,而IE8(包括IE8)之前的浏览器是不支持svg的
接下来看代码吧
从后台获取到带id和父id的目录数据[json格式]
var module = requestUrl('/Home/ModuleList', null); module = eval("(" + module + ")");
再将json拼成需要的svg格式
//svg图数据var treeData = null;//如果左侧菜单目录不为空if (module.total != 0) {var json = "[";//循环第一层for (var i = 0; i < module.total; i++) {//根节点var root = module.rows[i].PARENTID;//如果为第一层if (module.rows[i].LEVEL == '1') {json += "{";json += "'name': '" + module.rows[i].MODULE + "(" + module.rows[i].MODULEID +")',";json += "'parent':'信息管理系统(0)','value': 10,'children': [";//当前的模块IDvar moduleId = module.rows[i].MODULEID;var parentId = null;for (var j = 0; j < module.total; j++) {//如果为第二层if (module.rows[j].LEVEL == '2') {//获取第二层父IDparentId = module.rows[j].PARENTID;var moduleId_children = module.rows[j].MODULEID;//如果第二层父ID等于第一层模块IDif (moduleId == parentId) {json += "{";json += "'name':'" + module.rows[j].MODULE + "(" + module.rows[j].MODULEID+")',";json += "'parent': '" + module.rows[i].MODULE + "','value': 10,'children': [";for (var k = 0; k < module.total; k++) {if (module.rows[k].LEVEL == '3') {parentId = null;parentId = module.rows[k].PARENTID;if (moduleId_children == parentId) {json += "{";json += "'name': '" + module.rows[k].MODULE + "(" + module.rows[k].MODULEID +")','value': 5";json += "},";}}}json += "]},";}}}json += "]},";}}json += "]";//svg数据[json]treeData = [{"name": "信息管理系统(0)","parent": "root","value": 10,"children": eval("(" + json + ")")}];
接下来是绘制svg图的代码:
// ************** Generate the tree diagram *****************//定义树图的全局属性(宽高)var margin = { top: 10, right: 120, bottom: 20, left: 400 },width = 1200 - margin.right - margin.left,height = 600 - margin.top - margin.bottom;var i = 0,duration = 750,//过渡延迟时间 root;var tree = d3.layout.tree()//创建一个树布局 .size([height, width]);var diagonal = d3.svg.diagonal().projection(function (d) { return [d.y, d.x]; });//创建新的斜线生成器//声明与定义画布属性var svg = d3.select("body").append("svg").attr("width", width + margin.right + margin.left).attr("height", height + margin.top + margin.bottom).append("g").attr("transform", "translate(" + margin.left + "," + margin.top + ")");root = treeData[0];//treeData为上边定义的节点属性root.x0 = height / 2;root.y0 = 0;update(root);d3.select(self.frameElement).style("height", "750px");function update(source) {// Compute the new tree layout.计算新树图的布局var nodes = tree.nodes(root).reverse(),links = tree.links(nodes);// Normalize for fixed-depth.设置y坐标点,每层占180pxnodes.forEach(function (d) { d.y = d.depth * 180; });// Update the nodes…每个node对应一个groupvar node = svg.selectAll("g.node").data(nodes, function (d) { return d.id || (d.id = ++i); });//data():绑定一个数组到选择集上,数组的各项值分别与选择集的各元素绑定// Enter any new nodes at the parent's previous position.新增节点数据集,设置位置var nodeEnter = node.enter().append("g") //在 svg 中添加一个g,g是 svg 中的一个属性,是 group 的意思,它表示一组什么东西,如一组 lines , rects ,circles 其实坐标轴就是由这些东西构成的。.attr("class", "node") //attr设置html属性,style设置css属性.attr("transform", function (d) { return "translate(" + source.y0 + "," + source.x0 + ")"; }).on("click", click);//添加连接点---此处设置的是圆圈过渡时候的效果(颜色)// nodeEnter.append("circle")// .attr("r", 1e-6);//d 代表数据,也就是与某元素绑定的数据。 nodeEnter.append("path").style("stroke-width", "2px").style("stroke", "#EB5409").style("fill", "white").attr("d", d3.svg.symbol().size(function (d) {if(d.value <= 9) { return "400"; } else if(d.value >= 9) { return "400"; }}).type(function (d) {if(d.value <= 9) { return "triangle-up"; } else if(d.value >= 9) { return "circle"; }})).attr('class', function (d) {if (d.value <= 9) {return 'bling';} else {return 'fill_normal';}});//添加标签nodeEnter.append("text").attr("x", function (d) { return d.children || d._children ? -13 : 13; }).attr("dy", ".35em").attr("text-anchor", function (d) { return d.children || d._children ? "end" : "start"; }).text(function (d) { return d.name; }).style("fill-opacity", 1e-6);// Transition nodes to their new position.将节点过渡到一个新的位置-----主要是针对节点过渡过程中的过渡效果//node就是保留的数据集,为原来数据的图形添加过渡动画。首先是整个组的位置var nodeUpdate = node.transition() //开始一个动画过渡.duration(duration) //过渡延迟时间,此处主要设置的是圆圈节点随斜线的过渡延迟.attr("r", 10).attr("transform", function (d) { return "translate(" + d.y + "," + d.x + ")"; });//更新连接点的填充色// nodeUpdate.select("circle")// .attr("r", 10)// .attr('class',function(d){// if(d.value <= 9){// return 'bling';// }else{// return 'fill_normal';// }// });nodeUpdate.select("path").style("stroke-width", "2px").style("stroke", "#EB5409").style("fill", "white").attr("d", d3.svg.symbol().size(function (d) {if(d.value <= 9) { return "400"; } else if(d.value >= 9) { return "400"; }}).type(function (d) {if(d.value <= 9) { return "triangle-up"; } else if(d.value >= 9) { return "circle"; }})).attr('class', function (d) {if (d.value <= 9) {return 'bling';} else {return 'fill_normal';}});nodeUpdate.select("text").style("fill-opacity", 1);// Transition exiting nodes to the parent's new position.过渡现有的节点到父母的新位置。//最后处理消失的数据,添加消失动画var nodeExit = node.exit().transition().duration(duration).attr("transform", function (d) { return "translate(" + source.y + "," + source.x + ")"; }).remove();nodeExit.select("circle").attr("r", 1e-6);nodeExit.select("text").style("fill-opacity", 1e-6);// Update the links…线操作相关//再处理连线集合var link = svg.selectAll("path.link").data(links, function (d) { return d.target.id; });// Enter any new links at the parent's previous position.//添加新的连线link.enter().insert("path", "g").attr("class", "link").attr("d", function (d) {var o = { x: source.x0, y: source.y0 };return diagonal({ source: o, target: o }); //diagonal - 生成一个二维贝塞尔连接器, 用于节点连接图. }).style("stroke", function (d) {//d包含当前的属性console.log(d)return '#ccc';});// Transition links to their new position.将斜线过渡到新的位置//保留的连线添加过渡动画 link.transition().duration(duration).attr("d", diagonal);// Transition exiting nodes to the parent's new position.过渡现有的斜线到父母的新位置。//消失的连线添加过渡动画 link.exit().transition().duration(duration).attr("d", function (d) {var o = { x: source.x, y: source.y };return diagonal({ source: o, target: o });}).remove();// Stash the old positions for transition.将旧的斜线过渡效果隐藏nodes.forEach(function (d) {d.x0 = d.x;d.y0 = d.y;});}//定义一个将某节点折叠的函数//Toggle children on click.切换子节点事件function click(d) {if (d.children) {d._children = d.children;d.children = null;} else {d.children = d._children;d._children = null;}update(d);}// 定义菜单选项var userMenuData = [[{text: "添加",func: function () {// id为节点idvar id = $(this).children("text").html();id = id.substring(id.indexOf("(") + 1, id.indexOf(")"));showDialog(id);}},{text: "修改",func: function () {var id = $(this).children("text").html();id = id.substring(id.indexOf("(") + 1, id.indexOf(")"));showEditDialog(id);}},{text: "禁用",func: function () {var id = $(this).children("text").html();id = id.substring(id.indexOf("(") + 1, id.indexOf(")"));}},{text: "删除",func: function () {var id = $(this).children("text").html();id = id.substring(id.indexOf("(") + 1, id.indexOf(")"));deleteAppModule(id);}}]];// 事件监听方式添加事件绑定$("g").smartMenu(userMenuData, {name: "chatRightControl",container: "g.node"});
效果如下图:
使用d3.v3插件绘制出svg图相关推荐
- D3 v3版本绘制力导向图更新节点时JS控制台报错 :Error: circle attribute cx: Expected length, NaN解决办法
D3的v3版本,很古老了. 拿来绘制力导向图,画布初始化的代码如下: //代码不完整,仅作演示以说明问题 //节点数组var nodes = [ { name: "sssss" , ...
- 利用D3.js快速绘制力导向图
碎碎念: 最近课题需要基于图论和力导向图可视化每个脑电通道之间的连接性,MATLAB画的效果差强人意,于是上网搜寻到JavaScript 的一个函数库--D3.js,想快速得到数据的可视化结果 简介D ...
- python绘制的Svg图打开一片空白
当使用下面的代码画图的时候,生成的svg是一片空白 plt.show() plt.savefig('myplot.svg', format='svg') print("save t-sne ...
- d3.js v3版本实现-树状图
参考的例子:http://bl.ocks.org/robschmuecker/7880033 一.为什么选择d3.js 二.d3.js概述 三:树状图实现 1.创建svg 2.在svg元素里面画一个g ...
- python态密度曲线绘制_使用Multiwfn绘制态密度(DOS)图考察电子结构
使用Multiwfn绘制态密度(DOS)图考察电子结构 文/Sobereva@北京科音 First release: 2019-May-14 Last update: 2020-Nov-17 0 前 ...
- qcustomplot绘制热力图瀑布图_使用REmap绘制中国地图
上次我们介绍了使用ggplot2绘制中国热力地图,需要温习的同学可以点击以下链接 使用ggplot2绘制中国地图 .在使用ggplot2绘制的时候,需要进行数据处理的步骤比较多,今天我们介绍一个新的 ...
- python 四象限图_使用matplotlib绘制四象限图
今天简单研究了一下在python中绘制四象限图的问题,结合前人相关研究成果,绘制出的图效果如下: 绘制这种图的要点是:自己构造新的x轴和y轴,不要用散点图默认的横纵坐标系,并且不要显示原来的横纵坐标系 ...
- python画三维立体图-Python 竟能绘制出如此酷炫的三维图
原标题:Python 竟能绘制出如此酷炫的三维图 通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制出三维 ...
- python绘制3d图形-万万没想到,Python 竟能绘制出如此酷炫的三维图
作者 | Jay Alammar 译者 | 高级农民工 通常我们用 Python 绘制的都是二维平面图,但有时也需要绘制三维场景图,比如像下面这样的: 这些图怎么做出来呢?今天就来分享下如何一步步绘制 ...
最新文章
- git cherry-pick. 如何把已经提交的commit, 从一个分支放到另一个分支
- 11gR2RAC环境DBCA创建一个数据库错误ORA-15055 ORA-15001
- 大公司病,真 TM 形象
- Vue Vuex todo举例
- 会话技术Cookie
- 【Java】文件操作
- SQL Server 输出 XML
- iOS-格式化金额,三位一逗号
- python人脸识别教程_50行Python代码+OpenCV实现人脸识别!史上最详细的教程!
- 判断力有时候有多么重要?懂得选择多么重要?
- VS中Eric觉得好用的快捷键
- Go圣经-学习笔记之复合类型(二)
- Linux Apache Mysql PHP典范设置装备安排-2
- Hazelcast IMDG参考中文版手册-第一章-前言
- 网易云课堂-数据结构-练习题实现-00,打印沙漏
- js设置html打印不分页,web 页面分页打印的实现
- Sobel,拉普拉斯算子
- csv文件导入后台乱码_Excel打开csv文件出现乱码的解决方法
- 探月工程计算机技术学校,探月工程介绍
- 【软件与系统安全笔记】三、基础技术
热门文章
- html5 页面加载缓慢,html5体验优化页面加载的14条建议
- php连接mysql数据库失败_PHP远程连接MySQL数据库失败之原因
- 编辑器图片上传 linux,summernote 富文本编辑器上传本地图片
- mysql 根据时间 获取上个月_MySQL[0]
- 报错,npm ERR! code ENOLOCAL
- 安卓案例:初试谷歌图表
- 大数据学习笔记12:搭建伪分布式Spark
- 【BZOJ3226】【codevs2297】校门外的区间,线段树
- 【BZOJ3083】遥远的国度,树链剖分练习
- 【faebdc的模拟赛】T1错位