d3js树状图tree

使用ds.js画出树状图,样式可自定义。以下是效果图

介绍下过程:

  • 使用d3.js
  • 初始化d3和画布大小,tree = d3.layout.cluster().size([h, w])
  • 导入数据,使用d3默认处理数据: root = tree.nodes(data)
  • 处理数据(包括坐标的处理)
  • 展示数据

html代码如下,需要引用d3.js即可

<html>
<head>
	<title></title>
</head>
<body>
<js href="/Public/plugins/d3js/d3.min.js" />
<style type="text/css">
#body{
	height: 500px;
	width: 500px;
}
/*d3js*/
.node circle {
	cursor: pointer;
	fill: #fff;
	stroke: steelblue;
	stroke-width: 1.5px;
}

.node text {
	font-size: 11px;
	cursor: pointer;
}

path.link {
	fill: none;
	stroke: #ccc;
	stroke-width: 1.5px;
}

</style>

<div id="body" class="body">
	<div id="footer">
		<button onclick="updateinfo()">Click me</button>
	</div>
</div>

<script type="text/javascript">

updateinfo();

function updateinfo(){
	var json ={"r":{"name":"flare","children":[{"name":"animate","children":[{"name":"Easing"},{"name":"FunctionSequence"},{"name":"ISchedulable"},{"name":"Parallel"},{"name":"Parallel2"},{"name":"Parallel4"},{"name":"Parallel6"},{"name":"Pause"}]}]},"l":{"name":"flare","children":[{"name":"query","children":[{"name":"AggregateExpression","pos":"l"},{"name":"And","pos":"l"},{"name":"Arithmetic","pos":"l"},{"name":"fasdfasdf","pos":"l"},{"name":"Arithmasdfasetic","pos":"l"},{"name":"dfasdfa","pos":"l"}],"pos":"l"}]}};
	var d3js = function(json){
			var objRight = json[‘r‘] ? json[‘r‘] : {};
			var objLeft  = json[‘l‘] ? json[‘l‘] : {};
			d3jsTree(‘#body‘,objRight,objLeft);
		}
	d3js(json);
}

// d3js tree
function d3jsTree(aim,objRight,objLeft){
    // $(aim+‘ svg‘).remove();
    var m = [20, 120, 20, 120],
        w = 1280 - m[1] - m[3],
        h = 600 - m[0] - m[2],  //靠左
        i = 0;

    var tree = d3.layout.cluster().size([h, w]);

    var diagonal = d3.svg.diagonal().projection(function(d) { return [d.y, d.x]; });

    var vis = d3.select(aim).append("svg:svg")
                .attr("width", 1200)
                .attr("height", h + m[0] + m[2])
                .append("svg:g")
                .attr("transform", "translate(" + h + "," + m[0]+")");// translate(靠左,靠上)

    update(objRight,objLeft);function init_nodes(left){
        left.x0 = h /2;
        left.y0 =0;var nodes_dic =[];var left_nodes = tree.nodes(left);return left_nodes;}function update(source,l){var duration = d3.event && d3.event.altKey ?5000:500;// Compute the new tree layout.var nodes = init_nodes(source);var left_nodes = init_nodes(l);// if( l !=)var len = nodes.length;for(var i in left_nodes ){
            nodes[len++]= left_nodes[i];}// Normalize for fixed-depth.
        nodes.forEach(function(d){
            tmp =1;if( d.pos ==‘l‘){ tmp =-1;}
            d.y = tmp * d.depth *200;// 线条长度,也是作于方向// d.x = d.l * 63;});// Update the nodes…var node = vis.selectAll("g.node").data(nodes,function(d){return d.id ||(d.id =++i);});// Enter any new nodes at the parent‘s previous position.var nodeEnter = node.enter().append("svg:g").attr("class","node").attr("transform",function(d){return"translate("+ source.y0 +","+ source.x0 +")";}).on("click",function(d){ alert(d.name);});// 点击事件// .on("click", function(d) { ajax_get_server(d.name);console.log(d);toggle(d); update(d,l); });

        nodeEnter.append("svg:circle").attr("r",1e-6).style("fill",function(d){return d._children ?"lightsteelblue":"#fff";});

        nodeEnter.append("svg:text").attr("x",function(d){return d.children || d._children ?-10:10;}).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.var nodeUpdate = node.transition().duration(duration).attr("transform",function(d){return"translate("+ d.y +","+ d.x +")";});

        nodeUpdate.select("circle").attr("r",4.5).style("fill",function(d){return d._children ?"lightsteelblue":"#fff";});

        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 = vis.selectAll("path.link").data(tree.links(nodes),function(d){return d.target.id;});// Enter any new links at the parent‘s previous position.
        link.enter().insert("svg:path","g").attr("class","link").attr("d",function(d){var o ={x: source.x0, y: source.y0};return diagonal({source: o, target: o});}).transition().duration(duration).attr("d", diagonal);// 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.function toggle(d){if(d.children){
            d._children = d.children;// 闭合子节点
            d.children =null;}else{
            d.children = d._children;// 开启子节点
            d._children =null;}}}</script></body></html>
时间: 2024-12-12 06:26:51

d3js树状图tree的相关文章

D3树状图给指定特性的边特别显示颜色

D3作为前端图形显示的利器,功能之强,对底层技术细节要求相对比较多. 有一点,就是要理解其基本的数据和节点的匹配规则架构,即enter,update和exit原理,我前面的D3基础篇中有介绍过,不明白的可以再去研究下. 本篇博文,同样是在这个框架下,完成修改树状图中某两个节点之间的边用红色线条连接,实现表达特殊含义的目的. 背景故事: 微信朋友圈之间产品帖子相互转发,有些帖子转发后会有成交,只要有成交,则这个促成成交的节点及其之上的父节点都相应是有功劳的,这个轨迹需要用高亮的颜色表示(比如本例中

【 D3.js 入门系列 --- 9.5 】 树状图的制作

这一节学习树状图的制作.树状图的制作和集群图完全相同,经过这两种 layout 转换后的数据也很相似. 本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 树状图( Tree )通常用于表示层级.上下级.包含与被包含关系.树状图的制作和 9.4节集群图的制作 的代码几乎完全一样.不错,你没看错,几乎完全一样.那么为什么要把这两种图分开,它们有什么不同呢?先来看看对于同一组数据,它们的结果有什么不同.数据为: {

D3树状图异步按需加载数据

D3.js这个绘图工具,功能强大不必多说,完全一个Data Driven Document的绘图工具,用户可以按照自己的数据以及希望实现的图形,随心所欲的绘图. 图形绘制,D3默认采用的是异步加载,但是,这里的异步加载,指的是一次性的将图形展示所需要的数据异步的方式加载到浏览器前端显示.主要有如下这两种方式: 1 d3.csv(url[[, row], callback]) 2 3 Creates a request for the CSV file at the specified url w

Linux命令之pstree - 以树状图显示进程间的关系

本文链接:http://codingstandards.iteye.com/blog/842156   (转载请注明出处) 用途说明 pstree命令以树状图显示进程间的关系(display a tree of processes).ps命令可以显示当前正在运行的那些进程的信息,但是对于它们之间的关系却显示得不够清晰.在Linux系统中,系统调用fork可以创建子进程,通过子shell也可以创建子进程,Linux系统中进程之间的关系天生就是一棵树,树的根就是进程PID为1的init进程. 常用参

[Linux] Linux命令之pstree - 以树状图显示进程间的关系

转载自: http://codingstandards.iteye.com/blog/842156 pstree命令以树状图显示进程间的关系(display a tree of processes).ps命令可以显示当前正在运行的那些进程的信息,但是对于它们之间的关系却显示得不够清晰.在Linux系统中,系统调用fork可以创建子进程,通过子shell也可以创建子进程,Linux系统中进程之间的关系天生就是一棵树,树的根就是进程PID为1的init进程. 常用参数 格式:pstree 以树状图显

ArcGIS教程:树状图

摘要 构造可显示特征文件中连续合并类之间的属性距离的树示意图(树状图). 用法 · 输入特征文件必须采用预定的特征文件格式.特征文件可使用 Iso 聚类或创建特征工具来创建.该文件必须至少包含两个类.可通过扩展名 .gsg 来识别特征文件. · 树状图的输出是一个 ASCII 文本文件.该文件包含两部分:表和图形. 第一部分是以合并顺序显示各类对之间距离的表.第二部分是使用类的 ASCII 字符的图形表达,用来演示合并关系和等级.图形说明了特征文件中合并类对之间的相对距离,这些距离均基于统计得到

Android开源图表之树状图和饼状图的官方示例的整理

最近由于工作需要,所以就在github上搜了下关于chart的三方框架 官方地址https://github.com/PhilJay/MPAndroidChart 由于工作需要我这里整理了一份Eclipse版本的类库.(有需要要的留下邮箱) 这就是Code中的效果(树状图) 1 public class BarChartActivity extends Activity implements OnChartValueSelectedListener{ 2 3 private BarChart m

bzoj 4871: [Shoi2017]摧毁“树状图”

4871: [Shoi2017]摧毁“树状图” Time Limit: 25 Sec  Memory Limit: 512 MBSubmit: 53  Solved: 9[Submit][Status][Discuss] Description 自从上次神刀手帮助蚯蚓国增添了上千万人口(蚯口?),蚯蚓国发展得越来越繁荣了!最近,他们在地下发现了 一些神奇的纸张,经过仔细研究,居然是D国X市的超级计算机设计图纸!这台计算机叫做‘树状图’,由n个计算 节点与n1条可以双向通信的网线连接而成,所有计算

一款很好用的JQuery dtree树状图插件

一款很好用的JQuery dtree树状图插件 树状图  -dtree 由于他的节点设置思想不错,使连接数据库的数据库设计比较方便. 下载dtree资源包,引用一下dtree.css和dtree.js文件,然后编写节点就行了. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quo